首页 > 解决方案 > 用于检索数组元素的紧凑指针

问题描述

我想使用紧凑符号访问二维数组。

如果数组被定义为如下的指针数组,那么我如何解析数组元素?

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;
}

标签: c

解决方案


以下代码应该有助于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)

推荐阅读