提问人:Gaurav Shende 提问时间:8/9/2022 最后编辑:wohlstadGaurav Shende 更新时间:8/9/2022 访问量:67
指向数组和变量的 C 指针
C pointer to an array and a variable
问:
#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;
}
谁能告诉我为什么访问值需要一元运算符 (*) 而不需要访问数组的值。retPtr1
retPtr
答:
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 指针一起使用,而应该说应该使用说明符。%p
print
上一个:将缓冲区传递给函数进行写入
下一个:如何在结构中存储未知大小的值数组
评论
*
retPtr1[0]
ptr[i]
等同于 。在第一个元素的情况下,所以*(ptr+i)
i == 0
ptr[0] == *ptr
retPtr[1] = ...
*(retPtr+1) = ...