文章目錄
1.結構體定義的三種方式:
1. 先聲明結構體類型,再定義變量名:
#include <stdio.h>
struct student {
char name[50];
int age;
};
struct student s1 = { "alien", 18 };
int main() {
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
}
s1.name = alien, s1.age = 18
2. 在聲明類型的同時定義變量名稱:
struct student2 {
char name[50];
int age;
} s2 = { "alien", 20 }, s3 = { "alien003", 23 };
3.直接定義結構體類型變量(無類型名):
struct { // 沒有設置結構體類型的名稱
char name[50];
int age;
} s4 = { "alien", 20 };
2.結構體元素的賦值方式:
#include <stdio.h>
#include <string.h>
//結構體類型的定義
struct stu {
char name[50];
int age;
};
int main() {
struct stu s1;
struct stu* p = &s1;
strcpy(s1.name, "abc"); //結構體變量,通過點運算符操作結構體成員
s1.age = 18;
printf("s1.name = %s, s1.age = %d\n", s1.name, s1.age);
printf("==========================\n");
strcpy((&s1)->name, "test_first"); //如果是指針變量,通過->操作結構體成員
(&s1)->age = 22;
printf("(&s1)->name = %s, (&s1)->age = %d\n", (&s1)->name, (&s1)->age);
printf("==========================\n");
strcpy((*p).name, "test_second"); //指針可以通過點運算符,操作結構體成員
(*p).age = 25;
printf("(*p).name = %s, (*p).age=%d\n", (*p).name, (*p).age);
return 0;
}
s1.name = abc, s1.age = 18
==========================
(&s1)->name = test_first, (&s1)->age = 22
==========================
(*p).name = test_second, (*p).age=25
3.將結構體名作爲函數的參數(不推薦)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//結構體變量名作爲函數的參數
void set_stu(struct stu tmp) {
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
}
int main() {
struct stu s = { "other", 17};
set_stu(s); //將結構體的名稱,傳遞給函數,相當於原始結構體的一個副本傳遞過去了
printf("s.name = %s, s.age = %d\n", s.name, s.age);
return 0;
}
tmp.name = alien, tmp.age = 18 //set_stu函數打印的內容
s.name = other, s.age = 17 //說明,main函數中的s變量的值,沒有被set_stu函數修改
- 結構體變量名傳遞給函數,相當於只是把值傳遞給某個函數,個人感覺像是全局傳遞給了某個函數,但是函數本身沒有把最終的參數傳遞給main函數
- 所以當函數運行完之後,函數修改之後結果,都隨着內存的回收,消失了,相當於沒有對main中的結構體s任何操作
- 最終在main中打印結構體信息的時候,s還是原始的內容
將函數體簡單的修改之後:
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//結構體變量名作爲函數的參數
struct stu set_stu(struct stu tmp) {
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return tmp;
}
int main() {
struct stu s = { "other", 17};
struct stu s_new = set_stu(s); //將結構體的名稱,傳遞給函數,相當於原始結構體的一個副本傳遞過去了
printf("s_new.name = %s, s_new.age = %d\n", s_new.name, s_new.age);
return 0;
}
tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18 // 說明main中的結構體s被修改了
4.將結構體的指針作爲函數的參數(推薦)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
//結構體變量名作爲函數的參數
void set_stu(struct stu *tmp) {
strcpy(tmp->name, "alien");
tmp->age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp->name, tmp->age);
}
int main() {
struct stu s = { "other", 17};
set_stu(&s); //將結構體的指針,傳遞給函數
printf("s_new.name = %s, s_new.age = %d\n", s.name, s.age);
return 0;
}
tmp.name = alien, tmp.age = 18
s_new.name = alien, s_new.age = 18 // 通過指針,成功的把main函數中的結構體s修改了值
5.在函數中初始化結構體:再把指針傳遞(不推薦)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
struct stu * set_stu() {
struct stu tmp;
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return &tmp; // 將棧上創建的結構體指針,傳遞出去
}
int main() {
struct stu s = { "other", 17};
struct stu * p = set_stu(); //相當於指針p去接收另一個函數在棧上創建的指針
printf("p->name = %s, p->age = %d\n", p->name, p->age);
printf("p->name = %s, p->age = %d\n", p->name, p->age);
return 0;
}
tmp.name = alien, tmp.age = 18
p->name = 燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙, p->age = 18
p->name = 燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙燙, p->age = 7339044
- 因爲函數set_stu初始化的結構體是臨時變量,是在棧上創建的,隨着函數的結束,最終這個結構體變量的內存被回收
- 在main中,指針p接收到的內容就什麼都沒有了
- 最終結構體裏面,都是隨機數了(初始化狀態默認給的是隨機值)
6.在函數中初始化結構體:再把結構體傳遞出去(推薦)
#include <stdio.h>
#include <string.h>
struct stu {
char name[50];
int age;
};
struct stu set_stu() {
struct stu tmp;
strcpy(tmp.name, "alien");
tmp.age = 18;
printf("tmp.name = %s, tmp.age = %d\n", tmp.name, tmp.age);
return tmp; // 在棧上創建的結構體傳遞出去
}
int main() {
struct stu s = { "other", 17};
struct stu new_tmp = set_stu(); //相當於將結構體,傳遞給另一個結構體
printf("new_tmp.name = %s, new_tmp.age = %d\n", new_tmp.name, new_tmp.age);
return 0;
}
tmp.name = alien, tmp.age = 18
new_tmp.name = alien, new_tmp.age = 18