c - C多维数组中的指针地址

标签 c arrays memory pointers multidimensional-array

我在搞乱多维数组和指针。我一直在研究一个打印出简单数组的内容和地址的程序。这是我的数组声明:

int zippo[4][2] = { {2,4},
            {6,8},
            {1,3},
            {5,7}   };

我目前的理解是 zippo 是一个指针,它可以保存几个其他指针的地址。默认情况下,zippo保存指针zippo[0]的地址,也可以保存指针zippo[1]的地址,zippo[2]zippo[3].

现在,采取以下陈述:

printf("zippo[0] = %p\n", zippo[0]);
printf("  *zippo = %p\n", *zippo);
printf("   zippo = %p\n", zippo);

在我的机器上,输出如下:

zippo[0] = 0x7fff170e2230
  *zippo = 0x7fff170e2230
   zippo = 0x7fff170e2230

我完全理解为什么 zippo[0]*zippo 具有相同的值。它们都是指针,它们都存储整数 2 的地址(默认情况下),即 zippo[0][0]。但是 zippo 也共享相同的内存地址是怎么回事? zippo 不应该存储指针 zippo[0] 的地址吗?什么?

最佳答案

当数组表达式出现在大多数上下文中时,它的类型会隐式地从“T 的 N 元素数组”转换为“指向 T 的指针”,并将其值设置为指向数组中的第一个元素。此规则的异常(exception)情况是当数组表达式是 sizeof 或地址 (&) 运算符的操作数时,或者当数组是正在使用的字符串文字时作为声明中的初始化器。

因此,表达式 zippoint [4][2] 类型(int 的 2 元素数组的 4 元素数组)“衰减”到 int (*)[2](指向 2 元素 int 数组的指针)。类似地,zippo[0]的类型为int [2],隐式转换为int *

鉴于声明 int zippo[4][2],下表显示了涉及 zippo 的各种数组表达式的类型以及任何隐式转换:

Expression    Type            Implicitly converted to  Equivalent expression
----------    ----            -----------------------  ---------------------
zippo         int [4][2]      int (*)[2]               
&zippo        int (*)[4][2]       
*zippo        int [2]         int *                    zippo[0]
zippo[i]      int [2]         int *
&zippo[i]     int (*)[2]                               
*zippo[i]     int                                      zippo[i][0]
zippo[i][j]   int
&zippo[i][j]  int *
*zippo[i][j]  invalid

注意 zippo&zippo*zippozippo[0]&zippo[ 0]&zippo[0][0] 都具有相同的值;它们都指向数组的基数(数组的地址与数组的第一个元素的地址相同)。但是,各种表达式的类型都不同。

关于c - C多维数组中的指针地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2003745/

相关文章:

python - 为 Python 或 SWIG 模块创建编译 C-dll,如何继续?

c - 如何在 include_HEADERS 上一起使用 autotools nobase 和 nodist 前缀

javascript - 获取下一个数组元素

java - 如何将 ObjectGraphMeasurer.measure(object) 的结果转换为字节?

c - 使用指针在结构体中的元素之间移动

c++ - 在 C++ 中避免内存泄漏的一般准则

c - 最后通过一个循环,在函数调用时表现出奇怪和隐含的错误?

c - Linux 内核如何知道将输入事件写入哪个文件描述符?

javascript - React Native 中的 Arraylist 添加/删除 View

javascript - 选择正确的数据结构 : boolean check vs array . include(性能 vs 冗余)