提问人:Matteus Gutëmberg 提问时间:5/17/2021 更新时间:5/17/2021 访问量:522
任何人都可以向我解释为什么我的代码中弹出了这个错误“'('令牌之前的预期标识符'?
Anyone can explain me why this error "expected identifier before '(' token" is popping out in my code?
问:
#include <stdio.h>
#include <stdlib.h>
#define size 2
typedef struct data{
char name[20], address[20];
int number;
}person;
int main()
{
person p[size];
for(int i = 0; i < size; i++){
printf("Type the person's name %d\n", i + 1);
scanf("%20s", p[i].name);
}
printf("%c", (p + 1)->(name + 1));//where the error happens
return 0;
}
好吧,我想做的是打印出第二个结构数组的第二个字母,但正如你所看到的,错误被指出了,我不明白为什么会发生这种情况,因为如果“printf(”%c“, (p + 1)->name[1])”被写下来而不是在那里延伸,我 将指针的名称是指向数组第一个地址的指针这一事实 帐户,因此代码“name + 1”的延伸,因为 name 也是一个指针。那么,为什么会这样呢?它与标题中写下的错误有什么关系?
答:
2赞
dbush
5/17/2021
#1
运算符的右侧应为指定结构或联合中的字段名称的标识符。取而代之的是带括号的表达式。->
你所拥有的应该写成:
(p + 1)->name + 1
但是,此表达式具有 类型 ,而不是格式说明符所期望的,因此它实际上应该是:char *
char
%c
*((p + 1)->name + 1)
或者更好的是,使用数组索引表示法而不是显式指针算术和取消引用:
p[1].name[1]
评论
0赞
Matteus Gutëmberg
5/17/2021
好吧,“*((p + 1)->name + 1)”有效,但我不明白它是如何工作的......你能为我澄清一下吗?提前致谢!
0赞
dbush
5/18/2021
@MatteusGutëmberg 你对哪一部分感到困惑?
0赞
Matteus Gutëmberg
5/18/2021
这个“*((p + 1)->姓名 + 1)”!
0赞
dbush
5/18/2021
@MatteusGutëmberg 答案解释了它是什么。这个表达具体有什么意义?
0赞
Matteus Gutëmberg
5/18/2021
好吧,为什么你取消了那里的所有表达式,而不仅仅是这个拉伸 *(p + 1),我无法理解!
评论
p[1].name[1]
->