指针存储一个内存地址。如果您已经声明了一个变量和一个指向该变量的指针,则该指针将存储它所指向的变量的地址。下面是一个使用 cmets 的示例。
int a = 1; // allocated at 0x100, content is 1.
int* ptrA = &a; // allocated at 0x200, content is 0x100 (address of 'a')
为了通过指针访问 'a' 的内容,你必须解引用它,这是通过解引用运算符 (*) 完成的。
printf("'a' content is %d", *ptrA);
指向一个指针的指针也存储一个内存地址,但在这种情况下,是另一个指针的内存地址。如果您已经声明了一个变量、一个指向该变量的指针和一个指向该变量指针的指针,则第一个指针仍然像第一个示例中一样存储变量的地址,而最后一个指针存储第一个指针的地址。下面是一个使用 cmets 的示例。
int a = 1; // allocated at 0x100, content is 1.
int* ptrA = &a; // allocated at 0x200, content is 0x100 (address of 'a')
int** ptrToPtrA = &ptrA; // allocated at 0x300, content is 0x200 (address of 'ptrA')
为了通过指向指针的指针访问“a”的内容,您必须取消引用它,一次用于检索指向指针“ptrToPtrA”(指针“ptrA”)的指针的内容,然后从这里开始,一次用于检索指针'ptrA'的内容(变量内容'1')。
printf("'a' content is %d", **ptrToPtrA);
下面是 cmets 的最后一个示例,更接近您的原始问题。
#include <stdio.h>
int main(void)
{
// pointer to char (stores the address of a char)
char* x = "abc";
printf("'x' address is #%p, content is %c\n", x, *x);
// pointer to pointer to char (stores the addres of a pointer to char)
char** xPtr = &x;
printf("'xPtr' address is #%p, content is %p\n", xPtr, *xPtr);
printf("'x' content through 'xPtr' is %c\n", **xPtr);
return 0;
}