任何人都可以向我解释为什么我的代码中弹出了这个错误“'('令牌之前的预期标识符'?

Anyone can explain me why this error "expected identifier before '(' token" is popping out in my code?

提问人:Matteus Gutëmberg 提问时间:5/17/2021 更新时间:5/17/2021 访问量:522

问:

#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 也是一个指针。那么,为什么会这样呢?它与标题中写下的错误有什么关系?

数组 c 指针 struct 语法错误

评论

0赞 kaylum 5/17/2021
为了清楚起见,使用数组表示法(对自己和其他人来说都是如此)。p[1].name[1]
0赞 Matteus Gutëmberg 5/17/2021
谢谢你的建议,Kaylum!就我而言,我只是用这样的东西来预热我对指针及其行为的了解!
0赞 Luis Colorado 5/20/2021
在令牌之后,必须使用字段名称,而不是左括号,就像你所拥有的那样。->

答:

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),我无法理解!