聲明一個結構體變量,不管是否初始化,都開闢內存,聲明一個結構體指針變量,對其初始化的時候纔會開闢內存。數組
A a[3]; a是A型的,有3個,固然分配A乘3大小的空間ide
A* a; a是A*型的,固然只分配A*大小的空間,而不會分配A大小的空間
好像跟你說的不太同樣,結構體數組的話,我在課本里看到的確不用再次申請空間了啊[/quote]
結構體變量分配結構體自己大小的空間,結構體指針分配4個字節,其實任何類型的指針都是分配四個字節的指針空間。
因此:
A a[3]; //a裏面是三個A變量,因此分配三個結構體大小
A *a; //a是一個指針,分配4個字節,就算A再大,a也只是4個字節,由於任何類型的指針都是4個字節。要使用a,必須先要對指針初始化,也即分配空間了。
如:
A *a;
a = (A*)malloc(sizeof(A));
咱們徹底能夠撇開結構體,把問題簡單化成int類型來講明這個指針問題:
int a1[10];
int *a2;
很容易知道,a1是包含10個int的數組,大小也就是10*sizeof(int)。咱們能夠直接使用a1不要在進行什麼初始化或者分配空間的遊戲,由於數組a1裏面自己存放的就是int變量自己了。
而後a2,是一個int*的東西,也就是整型指針,a2不能存放int變量,它只能存放地址,一個int變量的地址。若是要使用a2,必須首先對a2初始化,即將它指向一個int變量的地址,如:
a2 = (int*)malloc(sizeof(int));
或者
int i = 10;
a2 = &i;
因此,malloc函數的做用是首先聲明一個變量,而後返回該變量的地址。
因此:a2 = (int*)malloc(sizeof(int)) 的含義就是把該變量的地址賦值給a2,和a = &i 本質上並無什麼不一樣,只是一個變量是棧上,一個是堆上,都是一個地址賦值。
因此,所謂的分配空間,就是對指針賦值,把一個變量的地址賦值給一個指針。