代码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]是1D数组,arr [3] [0]是2D数组。毕竟,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
答案 0 :(得分:3)
ptr[x]
可以写为*(ptr+x)
。因此,ptr[0]
会转换为*(ptr+0)
*ptr
。
答案 1 :(得分:1)
%d
期望值本身,而不是指向它的指针。 arr[3]
是指针,是指针数组中的第4个指针。 arr[3][0]
是实际数字。您也可以在循环中编写*arr[3]
,然后实际执行。
在将内存分配给int *a
后,指针的行为与数组相似,您可以将值存储为指向的位置*a=123
或a[0]=123
。此外,如果为2个整数分配内存,则可以访问第二个项目a[1]
(更简单),但也可以*(a+1)
底线:就int
- s而言,你有一个二维数组,而不是一个紧凑的n*m
- 风格的数组,但有一个经常被称为锯齿状(https://en.wikipedia.org/wiki/Jagged_array )。
答案 2 :(得分:0)
由于为两种情况计算的地址都是相同的,因此可以使用arr [3] [0]。 假设arr [3]的地址为1000。 arr [3] [0]的子地址为1000 + 0 * sizeof(int),即1000
答案 3 :(得分:0)
使用[0]
进行推理有一个简单的解释(尽管我不推荐它)。看到这个小代码:
int i;
int j[1];
这两个有什么区别?显然一个是大小为1的数组,但如果你考虑一下,大小为1的数组在某种程度上等于定义该类型一次。
取消引用*
在某种程度上等于使用数组索引进行访问。但是因为数据看起来像一个包含1个元素的数组,所以可以使用[0]
访问它。
答案 4 :(得分:-1)
使用此类代码。并尝试以这种方式改变你的代码, 希望这可能对你有所帮助。 欢呼声。
#include<stdio.h>
#include<stdlib.h>
int main()
{
float *p, tot = 0;
int i, n;
printf("Number of observations: ");
scanf("%d", &n);
p = (float*)malloc(n*sizeof(float));
if(p==NULL)
{
printf("Memory is not allocated");
exit(1);
}
for(i = 0; i < n; i++)
{
scanf("%f", p+i);
}
for(i = 0; i < n; i++)
{
tot += *(p+i);
}
printf("\nAverage = %.2f\n", tot/n);
return 0;
}
示例输入:
观察次数:4
12.12
34.14
43.1
45.87
示例输出:
平均值= 33.81