C语言的结构体,指向结构体变量的指针指向问题


# include<stdio.h>
int main()
{
    struct Student
    {
        int num;
        char name[10];
        float grade;
    }st1={12,"dfd",89};
    struct Student *p;
    p=&st1;
    printf("%6d%7s%7.2f",p->num,(*p).name,st1.grade);
    struct Student *q;
    q=p;              //为什么写成*q=*p就不行,指针变量指向之后不是等价吗?*p不是跟i等价吗?我赋值怎么了?
    printf("\n%6d%7s%7.2f",q->num,(*q).name,(*q).grade);


    

    


    return 0;
}
*p是指针本身的地址,你给*p赋值,就是把p这个指针指向了另一个实体

玩过红警和星际吗,魔兽呢,帝国时代呢,玩过任何即时战略游戏吗
玩即时战略的时候你可以给士兵编队,ctrl+数字表示编队,再按数字就可以快速找到你编队过的队伍,这个数字就相当于指针,ctrl就相当于星
你再按ctrl,那就是让另一个队伍占据原来的数字

struct Student是复杂类型,不能直接赋值,你的*p = *q相当于两个struct直接赋值,c语言是不支持的,
只能

(*p).num = (*q).num

当p和q都是指向基本数据类型(如int、float)时

int a = 0;
int b = 0;
int *p = &a;
int *q = &b;
*p = *q;

则可以这样操作

因为你没有给 q 空间,它只是一个野指针 或者为 NULL。 没有空间装载你的 *p 数据。

struct Student qq;
struct Student *q = &qq;
*q = *p;

struct Student *q = (struct Student *)malloc(sizeof(struct Student));
*q = *p;