问下 为什么结构体中可以用(p+i)->name来引用结构体成员 却不能使用p[i]->name来引用么(p为指针)

问下 为什么结构体中可以用(p+i)->name来引用结构体成员 却不能使用p[i]->name来引用么(p为指针),
但数组中又怎么可以用p[i]表示数组中的第i-1个元素呢
还有为什么(p+i)->name等同于(*p).name呢??麻烦大师给我详细讲讲

呐,指针中,(p+i) 跟p[i]是不一样的。
(p+i) 呢,是指针 p 所指向的地址+ i, 比如:
假设有一个结构体类型 struct student ,
struct student{ //定义结构体 Struct student
char[20] name;
}

struct student s[20]; //定义一个结构体struct student 数组。
struct student *p; //定义一个结构体struct student指针。
struct student *q[10]; //定义一个结构体struct student 指针数组.

p = s; //初始化指针p;
那么,在这时候,如果我们访问 (p+i)->name 的时候,就相当于访问 s[i] 的name属性; //(i<20)

而q[i]的使用则应该是:
q[i] = s; //这里,q[i] 的是指数组指针的下标为 i 的指针,使它指向 数组s的首地址。//(i<10)

q[i]->name; //这里就相对于s[0]的name属性; //(i<10)

由上面的两种对比,我们可以知道,
(p+i)->name 是指针p 所指向的数组的 下标为 i 的(结构体)变量 的name属性;
p[i]->name 则是指针数组p的下标为 i 的(指针) 变量 所指向的结构体变量的name属性。
所以,这两种用法是完全不一样的,不能混淆使用。

(p+i)->name 与 (*p).name 只有在i=0的情况下是等同的, 也就是说
p->name 等同于 (*p).name
同样的,有
(p+i)->name; 等同于 (*(p+i)).name
因为指针的 ‘->’ 符号是访问指针所指向的结构体变量的属性,而 ‘.’ 符号是访问结构体变量的属性

我们知道 (p+i) 其实还是一个指针,指向 结构体数组的下标为 i 的变量的指针,所以在访问name属性的时候,必须使用 ‘->’符号。
而*(p+i) 则是 一个变量,是 p+i 所指向的结构体变量, 所以,在访问其name属性的时候就要使用 '.'符号了。
因此 (p+i)->name; 等同于 (*(p+i)).name;

我这里有一个例子,你可以看下,应该可以理解的:
#include "stdio.h"

main(){
struct student {
char name[20];
struct student *next;
};

struct student s[3];
struct student *p; //定义指针
struct student *q[3]; //定义数组指针
p = s;
q[0] = s[1];
q[1] = s[0];
q[2] = s[2];
for(int i=0; i<3; i++) {
scanf("%s", &s[i]); //初始化 数组s
}
for(int j=0; j<3; j++) { //访问 (p+i)数组
printf("%s \n", (p+j)->name);
printf("%s \n", (*(p+j)).name);
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-09-27
p是指针,p[i]就是第i + 1个数,只能用.不能用->来表示

问下 为什么结构体中可以用(p+i)->name来引用结构体成员 却不能...
p[i]->name 则是指针数组p的下标为 i 的(指针) 变量 所指向的结构体变量的name属性。所以,这两种用法是完全不一样的,不能混淆使用。(p+i)->name 与 (*p).name 只有在i=0的情况下是等同的, 也就是说 p->name 等同于 (*p).name 同样的,有 (p+i)->name; 等同于 (*(p+i))....

&(p + i)->id, (p + i)->name什么意思
从你贴出来的这具代码来看,P应该是个结构体数组。P + i 就相当于P[i]。&取地址,->取结构体中的元素,但中间是个逗号,很明显不是一个完整的语句

为什么结构体中的成员类型不能是该结构体本身,却可以是以该结构体类型...
我的理解,结构体的在构造的时候肯定不能引用自身,不然就会形成嵌套死循环。通俗一点的理解,定义一个结构体的时候,在定义其成员的时候,这个结构体还未完成。发现引用了一个还未定义完成的结构体(也就是他自身),编译器会出错把。“以该结构体类型为基本型的” 后面是不是还有话啊,就这里看不懂...

关于c语言结构体变量成员引用的问题
是指针间的赋值,必须保证左右操作数的指针类型是一致的。由于n是结构体sk的第一个变量,因此其地址与结构体变量地址相同,可以强制转换得到正确的地址。c是一个二维数组,p是一个指向数组的指针,因此p的*运算都是得到一个数组,**运算才能取到数组中的值。只有D是**运算。

c语言结构成员名和局部变量名为什么可以同名
结构体中的成员变量名,与非结构体变量没有关系,可以相同。因为,结构体中的成员变量在引用时,必须要用结构体变量名+成员变量名来引用,所以不会有冲突!

在C语言中,结构体成员的引用为什么有时候可以不用“&"?
你在前面定义结构体时应该把name定义为一个字符型数组,如char name[10];因为姓名是用字符串表示的。应填为:stu[i].name,&stu[i].num,&stu[i].age.第一个不能用&,因为数组名name就代表了该数组的首地址,而&就是一个取地址符号,所以不需再用&,而后面的num,age都只是整型变量,所以要...

C语言的结构体变量为什么不能像数组一样使用?
根本区别是:数组是相同类型的数据的集合,元素在内存中是连续存放的;结构体一般是不同类型数据的集合,成员在内存中通常不是连续存放。而且,结构体是一种可以自定义内容的复杂类型,定义成功后就可以用它的名字或别名来说明或定义它这种类型的变量、指针、数组等,而数组只是把一系列同类型的数据依次...

结构体作为函数参数的引用问题
那么,结构体参数传递也是一个道理。传结构体指针,说明你要用结构体的数据,或者更改结构体变量。如果传双重指针,那么可能意味着这个参数还是个返回值,也许结构体本身并不存在,由函数区创建一个结构体,或者存在,但是函数要改变指针的指向。呵呵,看到你的第二个问题,就更加说明我的理解对了。所以...

c++结构体中什么时候用"." ,什么时候用"->" ?
对于引用符而言," . "带有 “查看” 的意思,所以,他可是归类为可显示的操作符。对于数据,是存在数据的覆盖和集合的,结构体相当于集合,那么,就用显示符号" . "显示结构体中的数据。而->,是指向符,指向集合类的数据的地址。指针可以指向地址,特殊符号 -> 也是指向的!但是 -> 特别的只能...

C语言中怎么给一个结构体用scanf进行赋值?
void getNum(struct student * p) \/\/函数:向结构体读取学号 { int i;for (i = 0; i < 5;i++)scanf_s("%d", &(p + i)->num);} void getName(struct student * p) \/\/函数:向结构体读取姓名 { int i;for (i = 0; i < 5; i++)scanf("%s", &(p + i)->name...

相似回答
大家正在搜