Que fait “int * p = + s”?

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

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

Le programme ci-dessus a été testé sur les compilateurs GCC et Clang et fonctionne correctement sur les deux compilateurs.

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

Le tableau s désintégré en type de pointeur?

L’ operator+ intégré peut prendre le type de pointeur comme opérande, de sorte que le transfert du tableau s entraîne la conversion de tableau en pointeur , puis le pointeur int* est renvoyé. Cela signifie que vous pouvez utiliser +s individuellement pour obtenir le pointeur. (Dans ce cas, c’est superflu; sans operator+ cela se transformera en pointeur puis assigné à p .)

(emphase le mien)

L’opérateur unaire plus intégré renvoie la valeur de son opérande. La seule situation où ce n’est pas un no-op, c’est quand l’opérande a un type entier ou un type d’énumération non-découpé, qui est changé par la promotion intégrale, par exemple, convertit char en int ou si conversion tableau à pointeur ou fonction à pointeur.

Testez ceci:

 #include  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 

C’est un symbole unaire plus qui n’a aucun effet pratique ici. Par exemple:

 #include  int main() { int a[] = {1}; std::cout << a << " " << +a << std::endl; } 

Ceci imprime la même adresse pour a et +a . Le tableau est désintégré pour pointer comme d'habitude.

Notez que si c'était unary moins -a place, GCC afficherait l'erreur:

 error: wrong type argument to unary minus 

Edit: Bien que cela n'ait aucun effet dans le code de 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.

Le tableau s désintégré en type de pointeur?

Oui.

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

Unary + opérateur oblige le tableau à se désintégrer en un pointeur.

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

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

La forme unaire + (+s) force l’opérande à être évalué en tant que nombre ou pointeur.

Pour plus d’informations, reportez-vous à cette réponse .

Ici, unary + fait juste * 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 sharepoint vue, unary + fait juste un pointeur p pour indiquer l’adresse de début du tableau.