對于初學C語言的同學來說,結構體傳參是一件值得我們考慮的問題,傳參的時候我們會想,是傳值好呢?還是傳址好?
接下來我們討論一下這個問題
舉個例子:
我們首先先創建一個結構體
struct Stu
{
char name[1000];
int num;
int age;
};
接下來我們創建一個結構體變數:
struct Stu s = { "zhangsan", 12345, 18 };
我們考慮列印出來結構體的成員,我們可以封裝兩個函式分別叫print1與print2
print1---------->用來傳值列印
print2---------->用來傳址列印
接下來我們實作這兩個函式
print1
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
完整代碼如下:
#include <stdio.h>
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print1(s);//傳值 列印結構體的資料
return 0;
}
結果如下

接下來我們實作print2 通過傳址呼叫此函式
print2
void print2(struct Stu* ps)
{
printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print2(&s);//傳址 列印結構體資料
return 0;
}
結果如下 一模一樣的結果

這是不禁出現了疑問,同樣都能達到列印結構體資料的效果,那么是傳值好還是傳址好呢?
在傳值時,形參是實參的一份臨時拷貝,它會在堆疊區開辟一塊新的空間,在結構體傳參時,如果結構體過大,開辟空間也就隨之增大,在空間與時間上來說,開銷比較大,
傳址時,地址在32位平臺占4個位元組,64位平臺占8個位元組,相對于結構體所占位元組而言要少,
函式在傳參時,引數需要壓堆疊,如果傳遞的一個結構體過大,引數壓堆疊的系統開銷較大,導致性能下降,
綜上所述 結構體傳參時,應優先考慮傳結構體的地址,
感謝觀看,
完整代碼如下:
struct Stu
{
char name[1000];
int num;
int age;
};
#include <stdio.h>
void print1(struct Stu ss)
{
printf("%s %d %d\n", ss.name, ss.num, ss.age);
}
void print2(struct Stu* ps)
{
printf("%s %d %d\n", ps->name, ps->num, ps->age);
}
int main()
{
struct Stu s = { "zhangsan", 12345, 18 };
print1(s);//傳值 列印結構體的資料
print2(&s);//傳址 列印結構體資料
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/258470.html
標籤:其他
