在下面的代码中,我将变量var
设置为20,然后将指针ptr
设置为地址var
,然后将指针ptrptr
设置为保存指针ptr
的内存地址。
#include <stdio.h>
void pointers()
{
int var = 20;
int* ptr;
ptr = &var;
int *ptrptr = ptr;
printf("Value at ptrptr[0] = %d \n", ptrptr[0]);
}
// Driver program
int main()
{
pointers();
return 0;
}
输出:
Value at ptrptr[0] = 20
为什么ptrptr[0]
返回val
存储的值,而不是指针ptr
的内存地址?
我认为索引运算符[]
返回该值存储的值。
5条答案
按热度按时间qvk1mo1f1#
这里有一个例子,我希望,能让我们更清楚地了解到底发生了什么。
在我的机器上打印:
由于
ptr
和ptr2
具有相同的类型(int *
),并且由于它们持有相同的指针值(因为我们提到了ptr2 = ptr
),因此它们的行为相同。由于C语言中“数组和指针的对应关系”,
*ptr
和ptr[0]
是相同的,两个表达式都产生ptr
所指向的值。如果你想让
ptrptr
成为一个指向另一个指针的指针,这里有一个例子,因为ptrptr
是一个两级指针,它所指向的值实际上是另一个指针,所以你必须非常仔细地考虑它。这将额外打印:
5rgfhyps2#
根据定义
*(ptr + n) === ptr[n]
为什么ptrptr[0]返回val存储的值,而不是指针ptr的内存地址。
我认为索引操作符[]返回该值存储的值。
没有
ptr[x]
取消引用指针。从第二个指针的名称判断,您可能希望指针对指针
tf7tbtn23#
这个
与相同(因为
ptrptr
和ptr
是相同类型且具有相同值):与相同(因为
a[b] == *(a+b)
):与
var
相同,因为ptr
指向var
,而*ptr
正在取消引用该指针。var
的值为20
。2ledvvac4#
ptrptr
与ptr
具有相同的类型,即指向int
的指针,因此当执行int *ptrptr = ptr;
时,ptrptr
和ptr
指向相同的地址(这就是它也编译的原因),而且ptrptr[0]
与*ptrptr
相同您必须将
ptrptr
定义为指向int
的指针的指针:如果你想让
ptrptr
指向ptr
Link to Compiler Explorer.
fivyi3re5#
您永远不要设置 ptrptr 来保存 ptr 的内存地址,而是设置为 ptr 本身的值。下面是一个用于说明的图像。首先为 ptr 分配 var 的地址,然后为 *ptrptr * 分配 ptr 的值,因此它也指向 var。
要使 ptrptr 指向 ptr,需要将其声明为