Arrays 任何人都可以向我解释这一错误的原因;在'之前应为标识符;(“令牌”在我的代码中弹出? #包括 #包括 #定义大小2 typedef结构数据{ 字符名称[20],地址[20]; 整数; }人; int main() { 人p[尺寸]; 对于(int i=0;i(name+1));//错误发生的位置 返回0; }

Arrays 任何人都可以向我解释这一错误的原因;在'之前应为标识符;(“令牌”在我的代码中弹出? #包括 #包括 #定义大小2 typedef结构数据{ 字符名称[20],地址[20]; 整数; }人; int main() { 人p[尺寸]; 对于(int i=0;i(name+1));//错误发生的位置 返回0; },arrays,c,pointers,struct,syntax-error,Arrays,C,Pointers,Struct,Syntax Error,我要做的是打印第二个结构数组的第二个字母,但正如你所看到的,错误被指出了,我不明白为什么会发生这种情况,因为如果“printf(“%c”),(p+1)->name[1])被写下来而不是在上面伸展,它就可以工作了,我 假设指针的名称是指向数组的第一个地址的指针 帐户,因此代码“name+1”的延伸,因为名称也是一个指针。那么,为什么会发生这种情况?它与写在标题中的错误有什么关系?运算符的右侧应该是一个标识符,用于指定结构或联合中的字段名。您使用的是一个圆括号表达式 你所拥有的应该写为: #incl

我要做的是打印第二个结构数组的第二个字母,但正如你所看到的,错误被指出了,我不明白为什么会发生这种情况,因为如果“printf(“%c”),(p+1)->name[1])被写下来而不是在上面伸展,它就可以工作了,我 假设指针的名称是指向数组的第一个地址的指针
帐户,因此代码“name+1”的延伸,因为名称也是一个指针。那么,为什么会发生这种情况?它与写在标题中的错误有什么关系?

运算符的右侧应该是一个标识符,用于指定结构或联合中的字段名。您使用的是一个圆括号表达式

你所拥有的应该写为:

#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; 
}
但是,此表达式的类型为
char*
,而不是
%c
格式说明符所期望的
char
,因此它实际上应该是:

(p + 1)->name + 1
或者更好的方法是使用数组索引表示法而不是显式指针算术和解引用:

*((p + 1)->name + 1)

->
运算符的右侧应该是一个标识符,用于指定结构或联合中的字段名。您可以使用括号中的表达式

你所拥有的应该写为:

#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; 
}
但是,此表达式的类型为
char*
,而不是
%c
格式说明符所期望的
char
,因此它实际上应该是:

(p + 1)->name + 1
或者更好的方法是使用数组索引表示法而不是显式指针算术和解引用:

*((p + 1)->name + 1)

为了清晰起见,请使用数组表示法(无论对自己还是对他人)。
p[1]。名称[1]
谢谢你的建议,Kaylum!在我的例子中,我只是用这样的东西来热身我对指针及其行为的了解!在
->
标记之后,必须使用字段名,而不是像你一样使用左括号。为了清楚起见,请使用数组表示法。
p[1].name[1]
谢谢你的建议,Kaylum!在我的例子中,我只是用这样的东西来预热我关于指针及其行为的知识!在
->
标记之后,必须使用字段名,而不是左括号,就像你所做的那样。嗯,“*((p+1)->name+1)”工作了,但我不明白它是怎么工作的……你能帮我澄清一下吗?提前谢谢!@MatteusGutëmberg你对什么部分感到困惑?这个“*((p+1)->name+1)”!@MatteusGutëmberg答案解释了它是什么。这个表达式有什么特别的地方是没有意义的?好吧,为什么你取消了所有表达式的引用,而不仅仅是这一段*(p+1),我不明白!好吧,“*((p+1)->name+1”工作了,但我不明白它是怎么工作的……你能帮我澄清一下吗?提前谢谢!@MatteusGutëmberg你对什么部分感到困惑?这个“*((p+1)->name+1)”!@MatteusGutëmberg答案解释了它是什么。这个表达式有什么特别的地方是没有意义的?好吧,为什么你取消了上面所有表达式的引用,而不仅仅是这个延伸*(p+1),我不明白!