C语言 指针的索引

gab6jxml  于 2023-02-11  发布在  其他
关注(0)|答案(5)|浏览(130)

在下面的代码中,我将变量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的内存地址?
我认为索引运算符[]返回该值存储的值。

qvk1mo1f

qvk1mo1f1#

这里有一个例子,我希望,能让我们更清楚地了解到底发生了什么。

#include <stdio.h>

int main()
{
    int var = 20;
    int *ptr = &var;
    int *ptr2 = ptr;

    printf("the value of the variable var is %d\n", var);
    printf("the address of the variable var is %p\n\n", &var);

    printf("the value of the pointer ptr is %p\n", ptr);
    printf("the value pointed to by ptr is %d\n", *ptr);
    printf("or, stated another way, it's %d\n\n", ptr[0]);

    printf("the value of the pointer ptr2 is %p\n", ptr2);
    printf("the value pointed to by ptr2 is %d\n", *ptr2);
}

在我的机器上打印:

the value of the variable var is 20
the address of the variable var is 0x7ffeed56992c

the value of the pointer ptr is 0x7ffeed56992c
the value pointed to by ptr is 20
or, stated another way, it's 20

the value of the pointer ptr2 is 0x7ffeed56992c
the value pointed to by ptr2 is 20

由于ptrptr2具有相同的类型(int *),并且由于它们持有相同的指针值(因为我们提到了ptr2 = ptr),因此它们的行为相同。
由于C语言中“数组和指针的对应关系”,*ptrptr[0]是相同的,两个表达式都产生ptr所指向的值。
如果你想让ptrptr成为一个指向另一个指针的指针,这里有一个例子,因为ptrptr是一个两级指针,它所指向的值实际上是另一个指针,所以你必须非常仔细地考虑它。

int **ptrptr = &ptr;
printf("the value of the pointer ptrptr is %p\n", ptrptr);
printf("the value pointed to by ptrptr is %p\n", *ptrptr);
printf("and the value pointed to by that pointer is %d\n", **ptrptr);

这将额外打印:

the value of the pointer ptrptr is 0x7ffeed569920
the value pointed to by ptrptr is 0x7ffeed56992c
and the value pointed to by that pointer is 20
5rgfhyps

5rgfhyps2#

根据定义*(ptr + n) === ptr[n]
为什么ptrptr[0]返回val存储的值,而不是指针ptr的内存地址。
我认为索引操作符[]返回该值存储的值。
没有ptr[x]取消引用指针。

int x = 5;
int *ptr = &x;
int *ptrptr = ptr; //this assigns reference stored in ptr to ptrptr. Now they store the same reference.

printf("Dereferencing pointer - %d\n", ptr[0]);
printf("Reference stored in the pointer - %p\n", (void *)ptr);
printf("Reference of the pointer (its address) - %p\n", (void *)&ptr);

从第二个指针的名称判断,您可能希望指针对指针

int x = 5;
int *ptr = &x;
int **ptrptr = &ptr; //poiter to pointer

printf("Dereferencing pointer to pointer - reference of x %p\n", (void *)ptrptr[0]);
printf("Reference stored in the pointer to pointer - reference of ptr%p\n", (void *)ptrptr);
printf("Reference of the pointer (its address) - %p\n", (void *)&ptrptr);
tf7tbtn2

tf7tbtn23#

这个

ptrptr[0]

与相同(因为ptrptrptr是相同类型且具有相同值):

ptr[0]

与相同(因为a[b] == *(a+b)):

*ptr

var相同,因为ptr指向var,而*ptr正在取消引用该指针。
var的值为20

2ledvvac

2ledvvac4#

ptrptrptr具有相同的类型,即指向int的指针,因此当执行int *ptrptr = ptr;时,ptrptrptr指向相同的地址(这就是它也编译的原因),而且ptrptr[0]*ptrptr相同
您必须将ptrptr定义为指向int的指针的指针:

int **ptrptr = &ptr;
printf("Value at ptrptr[0] = %d \n", *ptrptr[0]);

如果你想让ptrptr指向ptr
Link to Compiler Explorer.

fivyi3re

fivyi3re5#

您永远不要设置 ptrptr 来保存 ptr 的内存地址,而是设置为 ptr 本身的值。下面是一个用于说明的图像。首先为 ptr 分配 var 的地址,然后为 *ptrptr * 分配 ptr 的值,因此它也指向 var

要使 ptrptr 指向 ptr,需要将其声明为

int **ptrptr = &ptr;

相关问题