C语言结构体指针和结构体变量有什么区别?

它们的区别,可以详细地解释一下吗,最好从各个方面详细解释下。

1.内存空间上面的差别
假设有如下代码:
typedef struct Stu
{
int age;
}stu;
此时定义一个结构体指针 stu * p; 一个结构体变量 stu q;
结构体指针p是指向一个结构体的,这个结构体没有名字,它指向的是一个结构体空间的首地址;如果需要使用这个结构体就必须malloc一个空间出来或者将一个具有空间的结构体的首地址赋予它;如果你不给它分配空间代表这是一个野指针,访问的时候会出错;
结构体变量q,在定义变量的时候,编译器就自动给变量分配了合适的储存空间;
2.访问上的差别
结构体指针访问成员变量的操作符是 ‘->’,结构体变量访问成员变量的操作符是‘.’
并且(*p).age <=> p->age;

结构体指针的属性是 指针。
结构体的变量的属性是变量。
指针的作用是指向地址,可以指向数组 地址 等等。
二变量的作用就单纯是一个变量,可以提供地址。


typedef struct LinkList
{
    char data;
    LinkList* lchild;
    LinkList* rchild;
}BiNode,*BiTree;

想必你问的是数据结构里的有关链的问题,给出以下解释:
上面的代码中,BiNode和BiTree都是结构体变量,只不过BiNode是结构体变量,而另外一个是结构体指针变量;指针变量指向的结构体变量的地址,当你调用函数修改一个结构体变量的内容时,可以以此作为返回值类型。结构体变量就是这个结构体里面还有很多属性,按照上面的代码来说就是含有字符型的data和结构体指针类型的right和left(用于连接其他结构体变量)

结构体变量就是一个变量,把他看成和int,char一样的就行,只不过它的字节数是我们自己可以定义的,不同的字节区间表示了不同的数据类型,比如前四个字节表示int型,紧接着1个字节表示char类型。结构体变量的特点就是可以使用将相同属性的变量整合在一起。
比如描述一个人可以用一个包含姓名、性别、年龄……等的字段来描述,然而人有有很多,这也就有了结构体数组一说。

结构体指针就是可以指向结构体变量的指针,所谓指针类型,无非就是告诉指针每次++或--需要移动几个字节(这当中又会涉及到字节对齐的知识,简单来说就是为了方便计算机对变量的管理和使用,计算机会自动为结构体变量增加字节数,比如:
struct man {
char name[4];
char gender ;
int age;
}man,*p;
直接计算就得到这个man结构体的字节数是9;但是实际测得为12,如果p指向内存空间1004,则p++后p指向1016

img


当字节数不满4的倍数时,系统会自动追加字节

),
这并不会影响计算机读取这个数,但是会大大方便程序运行,
结构体指针的特殊之处还有就是,它可以指向结构体内部的成员,访问到指定成员的值,用法如 p->name

以学生类为例,

struct student 
{ int age;
int num;
char name[10];
};
struct student s1;//这里给出的是未使用typedef重命名的写法,方便理解
struct student *ps = &s1;

这里s1就是结构体变量,ps则是指向s1这个结构体变量的指针。
定义方式不同,如上代码所示。
从访问成员的方式来说,变量用.符号,指针用->符号,结构体变量访问:s1.age,结构体指针访问:s1->age。
从大小来说,结构体变量大小与成员有关,要考虑内存对齐,这里不展开,而指针大小再32位操作系统下固定4字节。