【发布时间】:2018-06-16 12:35:54
【问题描述】:
代码 1:
#include<stdio.h>
int main(void)
{
int* arr[5];
for(int i=0; i<5; i++) {
arr[i] = (int*)malloc(sizeof(int));
*arr[i] = i;
}
printf("%d",arr[3]);
return 0;
}
输出:
13509232
代码 2:
#include<stdio.h>
int main(void)
{
int* arr[5];
for(int i=0; i<5; i++) {
arr[i] = (int*)malloc(sizeof(int));
*arr[i] = i;
}
printf("%d",arr[3][0]);
return 0;
}
输出:
3
我已经声明了一个指针数组。我可以简单地编写 arr[3][0] 来取消引用它,而不是使用 *arr[3] 来取消引用存储的值。它适用于数组的所有维度。只需在其维度上添加一个额外的零,即可取消引用存储在该位置的值。
我无法理解,因为首先,arr[3] 是一维数组,而 arr[3][0] 是二维数组。毕竟,arr[3] 是一个地址,而 arr[3][0] 是存储在地址 arr[3] 的值。我可以用这种方式摆脱 * 运算符吗?请用通俗的话解释一下。
提前致谢。
编辑 1:让我们采用最简单的情况,单变量。
#include<stdio.h>
int main(void)
{
int k=5;
int *ptr=&k;
printf("%d",ptr[0]);
return 0;
}
输出:
5
【问题讨论】:
-
不要转换
malloc的返回值。如果您忘记包含 stdlib.h(顺便说一句,您确实这样做了),它会隐藏错误。 -
关于:
printf("%d",arr[3]);代码试图打印的值是一个地址。不是整数。所以正确的格式说明符是 '%p' 而不是 '%d' -
在调用任何堆分配函数时:
malloccallocrealloc,始终检查(!= NULL)返回值以确保操作成功 -
如果代码试图打印指向数组条目的值,正确的语法应该是:
printf( "%d\n", *(arr[3]) );这考虑了您要访问的值并考虑了C 运算符