63 votes

Que signifie "int * p = + s;" faire?

J'ai vu un type de programme bizarre 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, que fait int* p=+s; ?

Le tableau s décomposé en type pointeur?

63voto

songyuanyao Points 2265

Construit-en operator+ pourrait prendre le type de pointeur que son opérande, donc du passage du tableau s provoque tableau de pointeur de la conversion puis le pointeur int* est retourné. Cela signifie que vous pouvez utiliser +s individuellement afin d'obtenir le pointeur. (Pour ce cas, il est superflu; sans operator+ il va également à la carie de pointeur, puis assigné à l' p.)

(l'emphase est mienne)

Le haut-unaire plus opérateur retourne la valeur de son opérande. La seule situation où il n'est pas un no-op, c'est quand l'opérande a type intégral ou non délimité type d'énumération, qui est modifié par intégrante de la promotion, de l'e.g, il convertit char, int ou si l'opérande est soumis à la lvalue-à-rvalue, tableau de pointeur, ou la fonction de pointeur de la conversion.

25voto

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
 

11voto

taskinoor Points 24438

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

#include <iostream>

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

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

L'impression est la même adresse pour les deux a et +a. Le tableau est pourri de pointeur comme d'habitude.

Notez que, si elle avait été un unaire moins -a au lieu CCG serait montrer l'erreur:

error: wrong type argument to unary minus

Edit: Si elle n'a pas d'effet à l'OP du code, a et +a ne sont pas exactement les mêmes. Veuillez vous référer à la réponse en Khurshid Normuradov et songyuanyao pour plus de détails.

10voto

Rxmsc Points 927

Est la matrice de s pourri de type pointeur?

Oui.

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

Unaire + exploitant les forces de la matrice de décomposition d'un pointeur.

C++ Standard, 5.3.1 opérateurs Unaires(P7):

L'opérande de l'unaire + opérateur aura l'arithmétique, non délimité l'énumération, ou de type pointeur et le résultat est la valeur de la argument. Promotion intégrale est effectuée sur l'intégrale ou énumération opérandes. Le type du résultat est le type de la promotion opérande.

Unaire + forme (+s) des forces de l'opérande à être évaluée comme un nombre ou un pointeur.

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

0voto

Mudassar045 Points 51

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 point de vue, unary + crée simplement le pointeur p pour pointer l'adresse de début du tableau.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X