C---結構體:從入門到應用

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章