指针和结构体
现在只讨论自引用结构体,也就是结构成员的数据类型也是该结构的数据类型。
#include<stdio.h>
#include<stdlib.h>
int main(){
struct student{
char *name;
int score;
struct student *next;
};
struct student st[] = {
{"john",90,st+1},{"mary",85,st+2},{"peter",92,st}};
struct student *ptr[] = {st,st+1,st+2};
//printf("st=%x\n",st);
//printf("st+1=%x\n",st+1);
//printf("st+2=%x\n",st+2);
//printf("*ptr=%x\n",*ptr);
printf("%s\n",(++(*ptr)->next)->name);
//printf("*ptr=%x\n",*ptr);
printf("%d\n",(*ptr)->next->score); //这里是我一开始纠结的地方
return 0;
}
这个纠结的地方,我一直认为是85 把表达式(*ptr)->next->score等同于st->next->score等同于(st+1)->score
但是它输出的是92.
发现时因为
(++(*ptr)->next)->name
这个改变了一些内容,一开始并不知道是到底改变了哪里。
我们把注释去掉之后,看了下地址
发现*ptr的内容改变,
原因在于一些容易混淆的东西,
->的优先级大于*
*ptr->name等同于*(ptr->name)
++*ptr->name等同于++(*ptr->name)
所以(++(*ptr)->next)->name等同于((++(*ptr))->next)->name
这里就是*ptr内容变化的原因
还没有评论,来说两句吧...