我写了一个程序来测试指针 Action ,但我没有得到输出背后的逻辑。
就好像我使用 arr+1
然后我得到第 7 而不是第 2 个位置,类似的情况是 *arr+1
我觉得 很奇怪*
表达式显示的是地址而不是值。
谁能解释输出,拜托!
程序是:
#include<stdio.h>
int main()
{
static int arr[2][3][2] = {1,2,3,4,5,6,7,8,9,10,11,12};
int i,j,k;
printf("%d\t",arr);
printf("%d\t",*arr);
printf("%d\n",**arr);
printf("%d\n",***arr);
printf("%d\t",arr+1);
printf("%d\t",*arr+1);
printf("%d\n",**arr+1);
printf("%d\n",***arr+1);
for(i=0;i<2;i++)
{
for(j=0;j<3;j++)
{
for(k=0;k<2;k++)
printf("%d %u \n",*(*(*(arr+i)+j)+k),&arr[i][j][k]);
printf("\n");
}
printf("\n");
}
return 0;
}
输出是:
4202512 4202512 4202512
1
4202536 4202520 4202516
2
1 4202512
2 4202516
3 4202520
4 4202524
5 4202528
6 4202532
7 4202536
8 4202540
9 4202544
10 4202548
11 4202552
12 4202556
最佳答案
你声明了一个int [2][3][2]
数组,这意味着:
- 表达式
arr
的类型是一个int [2][3][2]
数组,因此您只能从该类型获取一个指针。< - 表达式
arr[0]
或*arr
的类型是一个int [3][2]
数组,所以你只能从该类型获取指针。 - 表达式
arr[0][0]
或**arr
的类型是一个int [2]
数组,所以您只能从该类型获取指针。 - 表达式
arr[0][0][0]
或***arr
的类型是一个int
,所以您只能从该类型中获取int
值。
这个过程的变化会产生相似的结果。
你总是得到相同的基地址,因为多维数组在内存中是平坦的,并且维度大小用于划分平坦内存。
int [2][2]
就像:
0, 1
2, 3
数字类似于内存中元素的顺序,而二维显示类似于数组的行/列访问。
关于c - 关于C语言中指针函数的困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21351838/