Wat is het verschil tussen int* i
en int** i
?
Antwoord 1, autoriteit 100%
Aanwijzer naar een geheel getal
int* i
Aanwijzer naar een aanwijzer naareen geheel getal
int** i
(Dwz, in het tweede geval heb je twee dereferenties nodig om toegang te krijgen tot de waarde van het gehele getal)
Antwoord 2, autoriteit 54%
int* i
:i
is een verwijzing naar een object van het typeint
int** i
:i
is een pointer naar een pointer naar een object van het typeint
int*** i
:i
is een aanwijzer naar een aanwijzer naar een aanwijzer naar een object van het typeint
int**** i
:i
is een aanwijzer naar een aanwijzer naar een aanwijzer naar een aanwijzer naar een object van het typeint
- …
Antwoord 3, autoriteit 31%
int* pi
pi
is een pointer naar een geheel getal
int **ppi
ppi
is een aanwijzer naar een aanwijzer naar een geheel getal.
BEWERKEN:
Je moet een goed boek over pointers lezen. Ik raad Aanwijzingen voor C door Kenneth Reekaan.
Antwoord 4, autoriteit 27%
Ik denk niet dat dit specifiek voor opencv is.
int *i
declareert een pointer naar een int. Dus i
slaat een geheugenadres op en C verwacht dat de inhoud van dat geheugenadres een int bevat.
int **i
declareert een aanwijzer naar… een aanwijzer. Naar een int. Dus i
bevat een adres, en op dat geheugenadres verwacht C een andere aanwijzer te zien. Dat tweede geheugenadres zal dan naar verwachting een int bevatten.
Houd er rekening mee dat, terwijl u een aanwijzer naar een int declareert, de werkelijke int niet wordt toegewezen. Het is dus geldig om int *i = 23
te zeggen, wat betekent: “Ik heb een variabele en ik wil dat deze verwijst naar geheugenadres 23 dat een int zal bevatten.” Maar als je daadwerkelijk zou proberen om geheugenadres 23 te lezen of te schrijven, zou je waarschijnlijk segfaulten, omdat je programma dat stuk RAM niet “bezit”. *i = 100
zou fout gaan. (De oplossing is om malloc() te gebruiken. Of je kunt het laten verwijzen naar een bestaande variabele, zoals in int j = 5; int *i = &j
)
Antwoord 5, autoriteit 27%
Stel dat je een leraar bent en aantekeningen moet geven aan een van je leerlingen.
int note;
Nou … ik bedoelde de hele klas
int *class_note; /* class_note[0]: note for Adam; class_note[1]: note for Brian; ... */
Nou … vergeet niet dat je meerdere lessen hebt
int **classes_notes; /* classes_notes[0][2]: note for Charles in class 0; ... */
En je geeft ook les aan verschillende instellingen
int ***intitute_note; /* institute_note[1][1][1]: note for David in class 1 of institute 1 */
etc, enz …
Antwoord 6, autoriteit 15%
Stel je hebt een paar vrienden, een van hen moet je iets geven (een schat… 🙂
Zeg dat John de schat heeft
int treasure = 10000; // in USD, EUR or even better, in SO rep points
Als je het rechtstreeks vraagt, John
int john = treasure;
int you = john;
Als je niet bij John kunt komen, maar Gill weet hoe hij contact met hem kan opnemen,
int john = treasure;
int *gill = &john;
int you = *gill;
Als je niet eens lid kunt worden van Gill, maar eerst contact moet opnemen met Jake die contact kan opnemen met Gill
int john = treasure;
int *gill = &john;
int **jake = &gill;
int you = **jake;
Enz… Aanwijzers zijn slechts indirectheden.
Dat was mijn laatste verhaal voor vandaag voordat ik naar bed ging 🙂
Antwoord 7, autoriteit 15%
Ik ben ervan overtuigd dat een foto meer zegt dan duizend woorden. Neem het volgende voorbeeld
// Finds the first integer "I" in the sequence of N integers pointed to by "A" .
// If an integer is found, the pointer pointed to by P is set to point to
// that integer.
void f(int N, int *A, int I, int **P) {
for(int i = 0; i < N; i++)
if(A[i] == I) {
// Set the pointer pointed to by P to point to the ith integer.
*P = &A[i];
return;
}
}
Dus in het bovenstaande wijst A
naar het eerste gehele getal in de reeks van N gehele getallen. En P
verwijst naar een aanwijzer waarin de beller de aanwijzer naar het gevonden gehele getal zal hebben opgeslagen.
int Is[] = { 1, 2, 3 };
int *P;
f(3, &Is[0], 2, &P);
assert(*P == 2);
&P
wordt gebruikt om het adres van P
naar de functie door te geven. Dit adres heeft type int **
, omdat het het adres is van een aanwijzer naar INT.
Antwoord 8, Autoriteit 4%
geen van beide is een verklaring. Verklaringsyntaxis toestaat niet ()
rond de gehele aangifte. Wat zijn deze ()
doen daar? Als dit een deel van de functieverklaring moet zijn, neemt u het hele functieverklaring op in uw vraag, aangezien in het algemeen de werkelijke betekenis van een verklaring daarvan kan afhangen. (Niet in deze echter.) del>
Wat betreft het verschil … er is één *
in de eerste en er zijn twee *
s in de tweede. Helpt het? Waarschijnlijk niet. De eerste verklaart i
als een aanwijzer naar int
. De tweede verklaart i
als wijzer naar int *
. Helpt dit? Waarschijnlijk niet veel. Zonder een specifiekere vraag is het moeilijk om een ​​zinvoller antwoord te geven.
Geef meer context, alstublieft. Of, als dit eigenlijk zo specifiek is als het kan krijgen, lees dan je favoriete C of C++ Book over Pointers. Dergelijke brede generieke vragen is niet iets dat u op het net vraagt.
Antwoord 9, Autoriteit 4%
INT * I ​​is het adres van een geheugenlocatie van een geheel getal
INT ** is het adres van een geheugenlocatie van een adres van een geheugenlocatie van een geheel getal
Antwoord 10
Merk op dat
int *i
is niet volledig verwisselbaar met
int i[]
Dit is te zien in dat het volgende zal compileren:
int *i = new int[5];
Hoewel dit niet zal zijn:
int i[] = new int[5];
Voor de tweede moet je het een constructorlijst geven:
int i[] = {5,2,1,6,3};
Je krijgt ook wat controle met het []-formulier:
int *i = new int[5];
int *j = &(i[1]);
delete j;
compileert waarschuwingsvrij, terwijl:
int i[] = {0,1,2,3,4};
int j[] = {i[1]};
delete j;
geeft de waarschuwingen:
waarschuwing C4156: verwijdering van een array-expressie zonder gebruik te maken van de array-vorm ‘delete’; matrixvorm vervangen
waarschuwing C4154: verwijdering van een array-expressie; conversie naar aanwijzer geleverd
Beide van deze laatste twee voorbeelden laten de applicatie crashen, maar de tweede versie (met het [] declaratietype) geeft een waarschuwing dat je jezelf in de voet schiet.
(Win32 console C++-project, Visual studio 2010)
Antwoord 11
Tekstvervanging is hier handig, maar pas op dat u het niet blindelings gebruikt, omdat het u kan misleiden (zoals in het geavanceerde voorbeeld hieronder).
T var; // var has type T
T* var; // var has type "pointer to T"
Dit werkt ongeacht wat T is:
int* var; // pointer to int
char* var; // pointer to char
double* var; // pointer to double
// advanced (and not pure textual substitution):
typedef int int3[3]; // confusing: int3 has type "array (of size 3) of ints"
// also known as "int[3]"
int3* var; // pointer to "array (of size 3) of ints"
// aka "pointer to int[3]"
int (*var)[3]; // same as above, note how the array type from the typedef
// gets "unwrapped" around the declaration, using parens
// because [] has higher precedence than *
// ("int* var[3];" is an array (size 3) of pointers to int)
Dit werkt wanneer t zelf een wijzertype is:
typedef int* T; // T is a synonym for "pointer to int"
T* var; // pointer to T
// which means pointer to pointer to int
// same as:
int** var;
Antwoord 12
int * i; // Ik ben een aanwijzer naar geheel getal. Het kan het adres van een geheel getal variabele bevatten.
int ** i; // Ik ben een aanwijzer om te worden aanwijzer naar geheel getal. Het kan het adres van een integer-aanwijzervariabele bevatten.