指针对指针的意义是什么

What is the significance of a pointer to a pointer?

本文关键字:指针 是什么      更新时间:2023-10-16

这样做有什么区别:

int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;

int *ipp = ip1;

这样做:

int **ipp2 = &ip1;

他们不是做同样的事情吗?持有一个指向变量i的指针(ip1)?

ipp2指向ip1。这与指向i完全不同。

样本代码:

int *ip1 = &i;
int **ipp2 = &ip1;
printf("%dn", **ipp2);    // 5
ip1 = &j;
printf("%dn", **ipp2);    // 6

所有变量在内存中都有一个保存其值的位置。让我们探讨iip1ippipp2 值之间的关系

这是在执行语句i = 5;时得到的结果。CCD_ 9在存储器中具有其位置,并且该位置处的值被设置为CCD_。

i ->     +--------+
         |  5     |
         +--------+
         ^
         |
         A1 (address of i)

这是在执行语句int* ip1 = &i;时得到的结果。ip1在内存中有其位置,并且该位置的值被设置为i的地址,我们将其指定为A1

ip1 ->   +--------+
         |   A1   |
         +--------+
         ^
         |
         A2 (address of ip1)

这就是在执行语句int* ipp = ip1;时发生的情况。ipp的存储位置处的值被设置为ip1的值,即A1

ipp ->   +--------+
         |   A1   |
         +--------+
         ^
         |
         A3 (address of ipp)

这就是在执行语句int** ipp2 = &ipp;时发生的情况。在ipp2的存储器位置处的值被设置为A3,它是"ip1"的地址。

ipp2 ->  +--------+
         |   A3   |
         +--------+
         ^
         |
         A4 (address of ipp2)

取消引用是如何工作的:

*ip1 = *A1 = 5
*ipp = *A1 = 5
*ipp2 = *A3 = A1
**ipp2 = **A3 = *A1 = 5

指针通常用于更改函数内变量的值:

void incr(int *ip) { *ip++; } 
void f() { int i = 0; incr(&i); printf("%dn", i); // 1

现在,用一个指针指向一个指针也没什么不同。您可以将指针传递给指向函数的指针,该函数可以更改指针指向的内容:原始指针

char *mom = "mom";
char *pop = "pop";
chooseMomOrPop(int choosePop, char **momOrPop) { *momOrPop =  choosePop ? pop : mom; }
void f() { char *mp = mom; chooseMomOrPop(1, &mom); printf("%sn", mom); } // pop

非常简单:指针是变量留在内存中的地址。由于指针本身就是一个变量,它的地址可以存储在另一个指针中,依此类推。为了更好地了解指针是什么以及它是如何工作的,只需认为它是一个地址即可。指针的类型,即int *中的int,是指所指向数据的类型,并影响指针对加法或减法的"反应",如指针算术中所述。"指向int指针的指针"是int**,因此总是指向int*的地址,并且当递增时,它会将地址移动到所需的字节数,以指向下一个int*