我被使用指针访问 2D 数组中的值的代码所困扰
I am stucked with this code of accessing values in 2D array using pointers
int main()
{
int a[4][2] = {1,2,3,4,5,6,7,8};
printf("%dn",*(a[2]+1));
printf("%dn", *(*(a + 2)+1));
getch();
}
二维数组可以被认为是一维数组。
该程序的输出在两个 printf 中均为 6。我的问题是printf("%dn", *(*(a + 2)+1));
如何执行以及星号*和+评估的优先级如何。
如果你有一个一维数组
int a[] = { 5, 6 };
则表达式 a[1]
等效于表达式 *( a + 1 )
并产生数组的第二个元素,等于 6
。
示例中的数组a
int a[4][2] = {1,2,3,4,5,6,7,8};
为了清楚起见,可以按以下方式重写
int a[4][2] = { { 1,2 }, { 3,4 }, { 5,6 }, { 7,8 } };
您还可以为数组引入 typedef 名称
typedef int T[2];
其中名称T
表示类型 int[2]
。
使用此 typedef,您可以通过以下方式重写原始数组的声明(可以省略初始化(
T a[4];
现在让我们考虑表达式*(*(a + 2)+1)
。子表达式 *(a + 2)
等效于 a[2]
,如上所述,将给出类型 T
数组的第三个元素,其中 T 的类型为 int[2]
。因此,此子表达式的对象将依次是一个类型为 T
的 dimensioanl 数组,并对应于数组 a
的第三个元素。我们可以想象它像
T tmp = { 5,6 };
或
int tmp[2] = { 5,6 };
因此,表达式*(*(a + 2)+1)
等价于表达式*( tmp + 1 )
等价于tmp[1]
,并将产生这个可想象的数组tmp的第二个元素。那就是你会得到6
.
让我们考虑一下您的两个 printf 调用。
单元格中的a[2]
int[2] = {5,6}
a[2] + 1
是一个包含数字 6 地址的指针(a[2] 隐式转换为指针(,因此在取消引用后它是 6。
a
is 和 int[4][2]
数组,该数组被转换为指针(转换后它保留指向第一个元素的指针(
a + 2
是一个指针,它保存指向数字 5 的指针地址
*(a + 2)
是一个包含数字 5 地址的指针
*(a + 2) + 1
是一个包含数字 6 地址的指针
*(*(a + 2) + 1)
是第6位
编辑:
对不起,对于一些错误的陈述。我考虑了注释,我需要补充一点,在上面的示例中,数组类型的 lvalue 表达式被隐式转换为指向其第一个元素的指针。
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 为什么我需要C++中不同的排序格式来对这个USACO代码上的数组和优先级队列进行排序
- 有没有一种代码密度较低的方法来使用非默认构造函数初始化数组?
- 请解释字谜的代码,我看不懂计数器数组,每个值已经是0
- 代码使用向量成功运行,但使用数组显示错误
- C++逗号分隔的输入数组代码过早退出
- 如何修改代码以打印出数组 v2
- 我正在尝试解决一个需要数组总和值但代码不起作用的问题,我想做这样的事情
- 如何在 c# 代码中通过引用调用时从 c++ dll 更新数组值?
- 使用基于数组和范围的 For 循环替换一些基本代码行
- G++ 发出警告,要求删除一个代码的数组,但不删除另一个代码的数组
- 为什么我的代码在尝试复制字符数组时引发 C6386 错误?
- 用于查找数组中最大元素的出现次数的代码,给出分段错误
- 调试代码块中的数组
- "p"数组如何使用 std::normal_distribution 存储以下代码中的值C++?
- 在带有模板的函数中传递未知大小的 std::数组.如何更正此代码?
- 有没有办法在c ++中清除空数组,请检查下面的代码以获取说明
- 我在 2D 数组的动态内存分配中遇到了一些奇怪的代码C++? 请解释一下这是什么?
- 我的旋转数组代码给出了大数组大小的错误
- 将字符数组转换为键代码数组 c++