web-dev-qa-db-fra.com

Qu'est-ce que "int * p = + s;" faire?

J'ai vu un type de programme étrange ici .

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;
}

Programme ci-dessus testé sur [~ # ~] gcc [~ # ~] et Clang compilateurs et fonctionne bien sur les deux compilateurs.

Je suis curieux de savoir, qu'est-ce que int* p=+s; faire?

Le tableau s est-il décomposé en type de pointeur?

63
msc

Intégré operator+ peut prendre le type de pointeur comme opérande. Par conséquent, si vous passez le tableau s, cela provoque conversion de tableau à pointeur , puis le pointeur int* est retourné. Cela signifie que vous pourriez utiliser +s individuellement pour obtenir le pointeur. (Dans ce cas, c'est superflu; sans operator+ il va aussi se désintégrer en pointeur puis assigné à p.)

(c'est moi qui souligne)

L'opérateur unaire plus intégré renvoie la valeur de son opérande. La seule situation dans laquelle il ne s'agit pas d'un no-op est celle où l'opérande a un type d'énumération intégral ou non délimité, qui est modifié par promotion intégrale, par exemple, il convertit char en int ou si l'opérande est soumis à lvalue-to -valeur, conversion de tableau en pointeur ou de fonction en pointeur.

63
songyuanyao

Testez ceci:

#include <stdio.h>
int main(){
    char s[] = { 'h', 'e', 'l', 'l', 'o' , ' ', 'w', 'o', 'r', 'l', 'd', '!'} ;
    printf("sizeof(s) : %zu,  sizeof(+s) : %zu\n", sizeof(s), sizeof(+s) ) ;
}

Sur mon PC (Ubuntu x86-64), il imprime:

sizeof(s): 12,  sizeof(+s) : 8

12 = number of elements s times size of char, or size of whole array
 8 = size of pointer
25

C'est un symbole unaire plus qui n'a pas d'effet pratique ici. Par exemple:

#include <iostream>

int main() {
    int a[] = {1};

    std::cout << a << " " << +a << std::endl;
}

Ceci affiche la même adresse pour a et +a. Le tableau est décomposé en pointeur comme d'habitude.

Notez que, s'il s'agissait d'un moins unaire -a à la place, alors GCC afficherait l’erreur:

error: wrong type argument to unary minus

Edit: Bien que cela n'ait aucun effet dans le code de l'OP, a et +a ne sont pas exactement les mêmes. Veuillez vous reporter aux réponses de Khurshid Normuradov et songyuanyao pour plus de détails.

11
taskinoor

Le tableau s est-il décomposé en type de pointeur?

Oui.

Qu'est-ce que int* p=+s; faire?

Unaire + l'opérateur force le tableau à se décomposer en un pointeur.

Norme C++, 5.3.1 Opérateurs unaires (P7):

L'opérande de l'opérateur unaire + doit avoir une énumération arithmétique, sans étendue, ou un type de pointeur et le résultat correspond à la valeur de l'argument. La promotion intégrale est effectuée sur des opérandes intégraux ou d'énumération. Le type du résultat est le type de l'opérande promu.

Le unaire + forme (+s) oblige l'opérande à être évalué en tant que nombre ou pointeur.

Pour plus d'informations, veuillez consulter ceci réponse au débordement de pile .

10
msc

Ici unaire + est en train de faire * p pour pointer les adresses du tableau Integer. Prenons deux tableaux s1 et s2

int s1[]={1,5,2};
int s2[]={2,5,2};

int *p=+s1;
p=+s2; 
printf("%d",(int)p[0]);

Sortie: 2

Donc à mon point de vue, unary + se contente de faire pointer p pour indiquer l’adresse de début du tableau.

0
Mudassar045