結構體指標的理解
阿新 • • 發佈:2019-02-11
以前總有一種疑惑。為什麼結構體的指標有的需要用分配空間有的不需要分配空間呢?現在總結一下思路。先上程式碼。
#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 有大小。