如何使用指针表示法访问二维数组中的结构元素?

时间:2018-01-19 00:03:36

标签: c arrays pointers

英语不是我的第一语言,所以我不确定我是否以正确的方式提出了问题。如果有人想纠正我,请随意这样做。现在,

我理解arr[i][j]*(arr+i+j)相同 但是,现在我有了这个

struct whatever{
int n;
int k;};
int main()
{
    struct whatever arr[4][4];
}

我需要知道如何通过指针符号访问结构中的'n'。我试过了(*(arr+i+j).n)

(它只是给出了一个错误':请求成员'n',而不是结构或联合)

以及其他很多变化,过去2小时我在论坛上找不到任何相关内容。

2 个答案:

答案 0 :(得分:3)

*(arr + i + j)arr[i + j]相同。

*(a + b)a[b] - 上述内容也相当于(arr + j)[i]i[j + arr](i + j)[arr]。但不要去那里。)< / p>

arr[i][j]*(*(arr + i) + j) (或*(j + *(i + arr))。不要这样做。)

如果你没有参加混淆比赛,那么明智的做法就是在你可以避免使用时使用指针运算。
指针算法使得编写看起来正确,完全错误,仍然编译的代码变得非常容易,然后在你可以做一些有用的事情时必须进行调试。

答案 1 :(得分:2)

正如我在comment中所说:

  

您需要撰写(*(*(arr + i) + j)).n - 这是使用arr[i][j].n符号的绝佳理由。我不得不从内到外逐步构建它:*(arr + i)给出arr[i]的结果;然后你必须把它当作指针表达式并给它*(ptr + j)处理;然后优先规则说.*更紧密,所以你需要额外的括号。除了作为学术练习外,不要使用指针和解引用来写。

您还可以使用箭头*运算符而不是点->运算符省略外括号和.(*(arr + i) + j)->n

这里有一些代码:

#include <stdio.h>

struct whatever{
    int n;
    int k;
};

int main(void)
{
    struct whatever arr[4][4] = { [2] = { [3] = { 371, 4 } } };
    printf("arr[2][3].n           = %d\n", arr[2][3].n);
    int i = 2;
    int j = 3;
    printf("(*(*(arr + %d) + %d)).n = %d\n", i, j, (*(*(arr + i) + j)).n);
    printf("(*(arr + %d) + %d)->n   = %d\n", i, j, (*(arr + i) + j)->n);
    return 0;
}

输出是:

arr[2][3].n           = 371
(*(*(arr + 2) + 3)).n = 371
(*(arr + 2) + 3)->n   = 371

(初始化使用C99指定的初始化器将元素arr[2][3]设置为值(struct whatever){ 371, 4 } - 这是struct whatever类型元素的复合文字符号;复合文字是C99特征太。)

此代码由GCC 7.2.0在运行macOS High Sierra 10.13.2的Mac上编译。