pointer - std:: array example c++




Was macht “int*p=+ s;”? (4)

Ich habe hier ein seltsames Programm gesehen.

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

Das obige Programm wurde auf GCC- und Clang- Compilern getestet und funktioniert auf beiden Compilern einwandfrei.

Ich bin neugierig zu wissen, was int* p=+s; tun?

Ist Array s auf Zeigertyp verfallen?


Ist Array s auf Zeigertyp verfallen?

Ja.

Was bedeutet int* p=+s; tun?

Der Operator Unary + zwingt das Array, auf einen Zeiger zu verfallen.

C ++ Standard, 5.3.1 Unäre Operatoren (P7):

Der Operand des Operators unary + muss eine arithmetische Aufzählung, eine Aufzählung ohne Gültigkeitsbereich oder einen Zeigertyp haben. Das Ergebnis ist der Wert des Arguments. Integrale Heraufstufung wird für Integral- oder Aufzählungsoperanden durchgeführt. Die Art des Ergebnisses ist die Art des heraufgestuften Operanden.

Die unäre + Form (+s) erzwingt, dass der Operand als Zahl oder Zeiger ausgewertet wird.

Weitere Informationen finden Sie in dieser Antwort zum Stapelüberlauf .


Das ist ein unäres Pluszeichen, das hier keine praktische Wirkung hat. Zum Beispiel:

#include <iostream>

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

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

Dies gibt die gleiche Adresse für a und +a . Das Array wird wie gewohnt in einen Zeiger verwandelt.

Wenn es stattdessen ein unäres Minus -a wäre, würde GCC den Fehler anzeigen:

error: wrong type argument to unary minus

Bearbeiten: Obwohl es im OP-Code keine Auswirkung hat, sind a und +a nicht genau gleich. Einzelheiten entnehmen Sie bitte den Antworten von Khurshid Normuradov und songyuanyao.


Hier macht unary + einfach * p, um auf die Adressen des Integer-Arrays zu zeigen. Nehmen wir zwei Arrays s1 und s2

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

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

Ausgabe: 2

Aus meiner Sicht bedeutet unary + nur, dass der Zeiger p auf die Anfangsadresse des Arrays zeigt.


Testen Sie dies:

#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) ) ;
}

Auf meinem PC (Ubuntu x86-64) druckt es:

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

woher

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






decay