1. 程式人生 > >結構體指標的理解

結構體指標的理解

以前總有一種疑惑。為什麼結構體的指標有的需要用分配空間有的不需要分配空間呢?現在總結一下思路。先上程式碼。


#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 有大小。