指针指针的意义是什么?

时间:2014-04-20 05:13:32

标签: c++ pointers

这样做有什么区别:

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



int *ipp = ip1;

并且这样做:

int **ipp2 = &ip1;

他们不做同样的事情吗?拿一个指向变量的指针(ip1),我?

4 个答案:

答案 0 :(得分:2)

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

示例代码:

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

答案 1 :(得分:1)

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

void incr(int *ip) { *ip++; } 
void f() { int i = 0; incr(&i); printf("%d\n", 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("%s\n", mom); } // pop

答案 2 :(得分:1)

所有变量在内存中都有一个位置,其中包含其值。让我们探讨iip1ippipp2

值之间的关系

这是执行语句i = 5;时获得的结果。 i在内存中的位置和位置的值设置为5

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

答案 3 :(得分:0)

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