英语不是我的第一语言,所以我不确定我是否以正确的方式提出了问题。如果有人想纠正我,请随意这样做。现在,
我理解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小时我在论坛上找不到任何相关内容。
答案 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上编译。