c - 用于检索数组元素的紧凑指针
问题描述
我想使用紧凑符号访问二维数组。
如果数组被定义为如下的指针数组,那么我如何解析数组元素?
int main(void)
{
char *a[2] = {
"databytes",
"dataword"
};
char **q = a;
return 0;
}
以下方法效果很好。
int main(void)
{
char a[2][10] = {
"databytes",
"dataword"
};
//char **p = a;
char *q = &a[0][0];
for(int i = 0; i < 2; i++)
for(int j = 0; j < 10; j++)
printf("%c\n", *q++);
return 0;
}
解决方案
以下代码应该有助于a
为您说明布局。a
对应于 2 × 10 = 20 字节的存储读取。如果a[0]
指向一个由 9 个字符组成的字符串,这些字符和NUL
为该字符串留出的空间。另一方面,如果a[1]
指向一个由 5 个字符组成的字符串,它总共占用 6 个字节的存储空间,并且a[1][6]
through处的值a[1][9]
是未初始化的。因此,一旦到达字符串的末尾,您需要跳到下一个字符串的开头。
#include <stdio.h>
int
main(void)
{
char a[][10] = {
"databytes",
"hello",
"dataword",
};
char* q = &a[0][0];
for (int i = 0; i < sizeof(a) / sizeof(a[0]); ++i) {
for (int j = 0, offset = i * sizeof(a[0]);
*(q + offset) && (j < sizeof(a[0]));
++j, ++offset) {
printf("%c --- (%d)\n", *(q + offset), j);
}
}
return 0;
}
输出:
d --- (0)
a --- (1)
t --- (2)
a --- (3)
b --- (4)
y --- (5)
t --- (6)
e --- (7)
s --- (8)
h --- (0)
e --- (1)
l --- (2)
l --- (3)
o --- (4)
d --- (0)
a --- (1)
t --- (2)
a --- (3)
w --- (4)
o --- (5)
r --- (6)
d --- (7)
推荐阅读
- asp.net - 如何将多个应用程序加载到单页应用程序中
- html - 旋转文本后如何自动调整容器/父级的宽度?
- javascript - javascript alt/花式文本生成
- javascript - 使用节点检查器 CLI 调试 typescript 时显示原始 typescript 文件
- excel - 从同一工作簿中的另一个工作表读取数据的用户定义函数
- c - C中的字谜测试器
- java - 如果语句和布尔问题?
- javascript - 写入和读取文件可能会进行currying和回调吗?
- deployment - Canary 部署代码是否需要在较低的环境中进行测试?
- jquery - 如何显示所有图像