指针和结构体

短命女 2022-08-24 05:12 273阅读 0赞

现在只讨论自引用结构体,也就是结构成员的数据类型也是该结构的数据类型。

  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. int main(){
  4. struct student{
  5. char *name;
  6. int score;
  7. struct student *next;
  8. };
  9. struct student st[] = {
  10. {"john",90,st+1},{"mary",85,st+2},{"peter",92,st}};
  11. struct student *ptr[] = {st,st+1,st+2};
  12. //printf("st=%x\n",st);
  13. //printf("st+1=%x\n",st+1);
  14. //printf("st+2=%x\n",st+2);
  15. //printf("*ptr=%x\n",*ptr);
  16. printf("%s\n",(++(*ptr)->next)->name);
  17. //printf("*ptr=%x\n",*ptr);
  18. printf("%d\n",(*ptr)->next->score); //这里是我一开始纠结的地方
  19. return 0;
  20. }

20140626151016078

这个纠结的地方,我一直认为是85 把表达式(*ptr)->next->score等同于st->next->score等同于(st+1)->score

但是它输出的是92.

发现时因为

  1. (++(*ptr)->next)->name

这个改变了一些内容,一开始并不知道是到底改变了哪里。

我们把注释去掉之后,看了下地址

20140626151328437

发现*ptr的内容改变,

原因在于一些容易混淆的东西,

->的优先级大于*

*ptr->name等同于*(ptr->name)

++*ptr->name等同于++(*ptr->name)

  1. 所以(++(*ptr)->next)->name等同于((++(*ptr))->next)->name
  2. 这里就是*ptr内容变化的原因

发表评论

表情:
评论列表 (有 0 条评论,273人围观)

还没有评论,来说两句吧...

相关阅读

    相关 结构变量结构指针

    结构体变量分配结构体本身大小的空间,结构体指针分配4个字节,其实任何类型的指针都是分配四个字节的指针空间。 所以: A a[3]; //a里面是三个A变量,所以分

    相关 结构指针

    一、结构体指针的定义与使用 当一个指针变量用来指向一个结构体变量时,称之为结构体指针变量。 结构体指针变量的值是所指向的结构体变量的起始地址。通过结构体指针即可访问该