以前总有一种疑惑。为什么结构体的指针有的需要用分配空间有的不需要分配空间呢?现在总结一下思路。先上代码。
#include <stdio.h>
#include <string.h>
#include <malloc.h>
/*先定义几类结构体*/
struct str{
int a;
int b;
}str1;
/*这是第一类结构体的形式,有结构体名,有结构体变量*/
struct str2{
int a;
int b;
};
/* 这是第二类结构体的形式,有结构体名,无结构体变量 */
typedef struct {
int a;
int b;
}STR3;
/* 这是第三类结构体的形式,把结构体重定义为STR3 */
typedef struct str4{
int a;
int b;
}STR4;
/*这是第四类结构体的形式,把结构体重定义为STR4,还有结构体名称*/
void main()
{
/*定义各类的指针*/
struct str *p;
struct str2 *p2;
STR3 *p3;
struct str4 *p4;
STR4 *p5;
/*-----------------------------------------------*/
p = &str1; /*结构体指针指向结构体变量的地址首地址*/
p->a=1;
p->b=2;
printf("p->a=%d,p->b=%d\n",p->a,p->b);
/*-----------------------------------------------*/
p2 = (struct str2 *)malloc(sizeof(struct str2)); /*为结构体指针分配对应结构体类型的大小的首地址*/
p2->a=1;
p2->b=2;
printf("p2->a=%d,p2->b=%d\n",p2->a,p2->b);
/*-----------------------------------------------*/
p3 = (STR3 *)malloc(sizeof(STR3)); /*为结构体指针分配对应结构体类型的大小的首地址*/
p3->a=1;
p3->b=2;
printf("p3->a=%d,p3->b=%d\n",p3->a,p3->b);
/*-----------------------------------------------*/
p4 = (struct str4 *)malloc(sizeof(struct str4));/*为结构体指针分配对应结构体类型的大小的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
struct str4 str4a;
p4 = &str4a;/*结构体指针指向结构体变量的地址的首地址*/
p4->a=1;
p4->b=2;
printf("p4->a=%d,p4->b=%d\n",p4->a,p4->b);
/*--------------------------------------------------*/
/*-----------------------------------------------*/
p5 = (STR4 *)malloc(sizeof(STR4));/*为结构体指针分配对应结构体类型的大小的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
p5 = &str4a;/*结构体指针指向结构体变量的地址的首地址*/
p5->a=1;
p5->b=2;
printf("p5->a=%d,p5->b=%d\n",p5->a,p5->b);
/*--------------------------------------------------*/
}
以上就是结构体指针的所有用法。总结来说,就是如果定义了结构体指针,你就得给他一个指向的地址。可以通过两种方式:
1:就是指向结构变量的首地址,注意是结构体变量的首地址,不是结构体的首地址,结构体是没有首地址的,它就是一个类型,类似int a的int ,变量a有地址,但是int是没地址的。所以不要指向自己定义的结构体名或者是结构体。而是结构体变量。
2:分配一段空间,让结构体指针指向这个空间。这个空间要是结构体指针对应结构体(结构体名)的大小。注意结构体有大小的,类似int a的int 有大小。