指向数组和变量的 C 指针

C pointer to an array and a variable

提问人:Gaurav Shende 提问时间:8/9/2022 最后编辑:wohlstadGaurav Shende 更新时间:8/9/2022 访问量:67

问:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int* retPtr = (int*)malloc(sizeof(int)*2);
    
    retPtr[0] = 0;
    retPtr[1] = 1;
    
    printf("%d\t%d",retPtr[0],retPtr[1]);
    
    int* retPtr1 = (int*)malloc(sizeof(int));
        
    *retPtr1 = 1;
    
    printf("\n%d",*retPtr1);
    
    return 0;
}

谁能告诉我为什么访问值需要一元运算符 (*) 而不需要访问数组的值。retPtr1retPtr

C 指针 动态 malloc

评论

2赞 David Ranieri 8/9/2022
你不需要用到,也可以用*retPtr1[0]
1赞 Barmar 8/9/2022
欢迎来到 Stack Overflow!不要投射 malloc
1赞 Barmar 8/9/2022
ptr[i]等同于 。在第一个元素的情况下,所以*(ptr+i)i == 0ptr[0] == *ptr
2赞 WhozCraig 8/9/2022
“retPtr 不需要”——这是需要的......在某种程度上,你只是在使用基本的语言语法糖来减轻你的打字负担。Your 是 的同义词。即使是最糟糕的基本 C 语言参考和操作方法中也涵盖了这一点。检查指针上的章节。retPtr[1] = ...*(retPtr+1) = ...

答:

1赞 Steve Summit 8/9/2022 #1

谁能告诉我为什么 retPtr1 需要一元运算符 (*) 来访问值,而 retPtr 不需要访问数组的值。

我不能告诉你为什么,因为这根本不是真的。可用于访问任何类型的指针(或数组),也可用于访问任何类型的指针(或数组)。*[]

以下是对程序的修改,演示了这两者:

int* retPtr = malloc(sizeof(int)*2);

retPtr[0] = 0;
retPtr[1] = 1;

printf("%d\t%d\n", retPtr[0], retPtr[1]);
printf("%d\t%d\n", *retPtr, *(retPtr + 1));

int* retPtr1 = malloc(sizeof(int));
    
*retPtr1 = 2;

printf("%d\n", *retPtr1);
printf("%d\n", retPtr1[0]);

两对调用访问完全相同的值。修改后的程序打印printf

0   1
0   1
2
2
0赞 Tenobaal 8/9/2022 #2

数组访问运算符只不过是添加和取消引用。 例如,以下行类似:

printf("%d\n", my_arr[0]);
printf("%d\n", *my_arr);

这些也是如此:

printf("%d\n", my_arr[1]);
printf("%d\n", *(my_arr + 1));

最后一行使用指针算术。这意味着,my_arr是指向内存地址的指针,如果我们向其添加某些内容,它将指向另一个内存地址。想象一下,你的内存是一个巨大的字节数组。内存地址是它的索引。当使用 * 运算符时,您将获取此索引处的值。但是,每当您使用数组访问运算符时,您首先要添加到索引/地址,然后再获取值。

让我们一步一步地分析一下。

int* my_arr = malloc(sizeof(int) * 5);
my_arr[0] = 0;
my_arr[2] = 5;

例如,my_arr现在可以0xff560。

int* my_arr2 = my_arr + 2;

现在my_arr2 0xff568,my_arr没有变化。将 8 添加到指针中,因为在此示例中,一个整数的大小为 4 个字节。

printf("%d %d\n", *my_arr, *my_arr2);

这将写成“0 5”。最后两行只是编译的写作方式:

printf("%d %d\n", my_arr[0], my_arr[2]);

顺便说一句,您可以在 printf 中输出带有“%p”的指针值。

评论

0赞 Chris 8/9/2022
当你说以下几行是相似的时,你应该说等效,因为它们是。此外,您不应该说可以将说明符与 for 指针一起使用,而应该说应该使用说明符。%pprint