这样做有什么区别:
int i = 5, j = 6, k = 7;
int *ip1 = &i, *ip2 = &j;
int *ipp = ip1;
并且这样做:
int **ipp2 = &ip1;
他们不做同样的事情吗?拿一个指向变量的指针(ip1),我?
答案 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)
所有变量在内存中都有一个位置,其中包含其值。让我们探讨i
,ip1
,ipp
和ipp2
这是执行语句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*