c - 关于C语言中指针函数的困惑

标签 c pointers

我写了一个程序来测试指针 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/

相关文章:

c# - 在 C 中引发和处理事件

c - 这两种在C中获取字符串输入的方法有什么区别?

c++ - 如何在使用字符串指针变量作为输入参数的函数中使用字符串值作为参数

c - 取消引用指针而不将它们指向变量

C - fread 似乎没有将数据读回内存

c - 努力理解文件指针?

c - 如何使密码更有效

c - 为什么 static 关键字在这里防止段错误?

c++ - 什么是数组到指针衰减?

c - sizeof 运算符在 C 中接受哪些参数?