Может ли переменная Pointer содержать адрес другой переменной Pointer? - PullRequest
4 голосов
/ 19 января 2012

Можно ли заставить переменную указателя содержать адрес другой переменной указателя? например:
int a; int *ptr,*ptr1; ptr=&a; ptr1=&ptr;

Ответы [ 6 ]

10 голосов
/ 19 января 2012

Конечно, указатель на указатель.

int i;
int *pi = &i;
int **ppi = π

Нет ничего особенно необычного в указателе на указатель. Это переменная, как и любая другая, и она содержит адрес переменной, как и любая другая. Это просто вопрос установки правильного типа, чтобы компилятор знал, что с ними делать.

3 голосов
/ 19 января 2012

Да, но он должен иметь правильный тип.В вашем примере int *ptr,*ptr1; и ptr, и ptr1 имеют тип "указатель на int", который может указывать только на int, а не на указатель.Если вы объявляете int *ptr, **ptr1;, то ptr1 имеет тип «указатель на int *» и, следовательно, может указывать на ptr.

1 голос
/ 19 января 2012

Вот пример, показывающий, что происходит

int a = 13; 
int *ptr,
int **ptr1;       // ** means pointer to pointer
ptr = &a;   
ptr1 = &ptr;

cout << a;        //value of a  

cout << *ptr;     //ptr points to a, *ptr is value of a  
cout << **ptr1;   //same as above

cout << &ptr;     //prints out the address of ptr
cout << *ptr1;    //same as above

То же самое работает для int ***ptr, int ****ptr.

0 голосов
/ 19 января 2012

Да, пожалуйста, см. Следующий код.Я надеюсь, что это послужит вашей цели

int a = 4;
int *ptr = &a;
int *ptr1 = (int*)&ptr; 
cout << **(int**)ptr1;

Здесь ptr1 - одиночный указатель, но ведет себя как двойной указатель

0 голосов
/ 19 января 2012

Здесь есть два ответа, и оба они да.

Два указателя могут указывать на одно и то же местоположение

int b, *p1=&b, *p2=&b;
*p1 = 123;
*p2; // equals 123

Вы также можете иметь указатель на указатель:

int x = 2, y = 3, * p = & x, ** q = & p;

Обратите внимание на дополнительную звездочку.

**q; // equals 2
*q = &y;
**q; // equals 3
**q = 4;
  y; // equals 4
0 голосов
/ 19 января 2012

Указатель на указатель возможен (и очень распространен), но int* может быть недостаточно большим, чтобы содержать адрес другого int*. используйте int**. (или void*, для общего указателя)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...