c - 在 C 中为 2D 数组声明指针的最佳方法是什么?
问题描述
我似乎找不到我要找的东西。我正在学习如何在 C 中使用 2D 数组,同时也在学习指针。为 2D 数组声明指针的最佳方法是什么?
我正在这样做
int nums[2][3] = {
{5, 4, 3},
{3, 0, 9}
};
int *numsptr = nums;
printf("%p\n", numsptr);
另外如何通过指针访问特定索引?我读的那篇文章是这么说的。
In general, nums[i][j] is equivalent to *(*(nums+i)+j)
我试着这样做。
printf("%d\n", (*numsptr + 1) + 2);
哪些输出8
(不在二维数组中)
解决方案
如何通过指针访问特定索引?
取决于指针。您可以声明一个指向 3 数组的指针ints
,这样您就可以像访问数组一样访问指针(但要注意sizeof
):
int (*ptr)[3] = nums;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
printf("[%d][%d] = %d\n", i, j, ptr[i][j]);
// since you mentioned `a[b] == *(a + b)` some alternatives:
// or printf("[%d][%d] = %d\n", i, j, *(*(ptr + i) + j));
// or printf("[%d][%d] = %d\n", i, j, *(ptr[i] + j));
// or printf("[%d][%d] = %d\n", i, j, (*(ptr + i))[j]);
// or pls dont printf("[%d][%d] = %d\n", i, j, i[ptr][j]);
}
}
您使用指向 2 个 3 int
s 数组的数组的指针。从语义上讲,这是另一回事,您必须首先取消引用指针:
int (*var)[2][3] = &nums;
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
printf("[%d][%d] = %d\n", i, j, (*var)[i][j]);
}
}
因为数组中的元素是连续放置在内存中的,所以您可以使用指向该数组的别名int
并自己执行行/列算术:
int *p = (int*)nums;
for (int i = 0; i < 2 * 3; ++i) {
printf("[%d] = %d\n", i, p[i]);
}
for (int i = 0; i < 2; ++i) {
for (int j = 0; j < 3; ++j) {
printf("[%d][%d] = %d\n", i, j, p[i * 3 + j]);
}
}
推荐阅读
- android - 如果表中不存在带有传递参数的表名,我们可以在 firbase 中自动创建数据库吗?安卓工作室
- mapbox - 找不到 com.mapbox.mapboxsdk:mapbox-android-sdk-gl-core:5.3.0
- node.js - Woocommerce REST API 更改运输方式计算类型
- arrays - 如何将哈希数组组合成一个数组?
- reactjs - React Component 不会在状态更改时重新渲染?
- android - 如何在颤动中减小gridview.builder的gridview项之间的空间大小
- cookies - 赛普拉斯 cy.visit 不发送带有请求的 cookie
- python - 1970-01-01 05:30:00,python开始计时的日期和时间有什么特别之处(当time.time() = 0时)
- python - Pymongo NumberLong 搜索
- python - 在文档字符串中强制执行参数并返回文档