1. 結構體,結構體指針作為函數參數有何區別
#include <stdio.h> #include <string.h>
struct animal { char name[30]; int num; }; //使用結構體作為參數 浪費內存 需要建立結構體
void change_struct(struct animal cat) { cat.num = 17; } //函數內部改變需要地址 所以需要指針保存
void change_point(struct animal *cat) { cat->num = 13; // (*cat).num = 1000;//*根據地址取出內容
} void main { struct animal cat = {0}; struct animal *pcat = &cat; cat.num = 20; change_struct(cat); printf("%d",cat.num); //輸出20 change_point(pcat); printf("%d",cat.num); //輸出13 cat.num = 28; change_point(&cat); //輸出13 printf("%d",cat.num); }
2. 綜上所述,就是傳遞結構體指針(或者取它的地址)的話,可以修改結構體里面的值。傳遞結構體的話,不能修改結構體變量的值。
3. 其中如果傳遞的是結構體的話,因為C語言的參數傳遞值調用方式是要求把參數的一份拷貝傳遞給參數,上面的name這個數組的長度是30,那么這個結構體將占用34個字節的空間,要想把它作為參數傳遞的,我們必須把34個字節都復制到堆棧中,以后再丟棄。所以傳遞指針的效率要高非常多。
4. 我以前以為,可以把結構體名字(實際上必須取它的地址)直接賦值給結構體指針,可能是字符串搞多了吧。