操屁眼的视频在线免费看,日本在线综合一区二区,久久在线观看免费视频,欧美日韩精品久久综

新聞資訊

    C語言全面梳理結(jié)構(gòu)體知識(shí)點(diǎn)

    更新時(shí)間:2022年07月08日 10:54:35 作者:南森森

    結(jié)構(gòu)體是一些值的集合,這些值稱為成員變量,結(jié)構(gòu)體的每個(gè)成員可以是不同類型的變量。本文將通過示例為大家詳細(xì)講講C語言中結(jié)構(gòu)體的使用,需要的可以參考一下

    目錄

    一、什么是結(jié)構(gòu)體

    為了更好地模擬現(xiàn)實(shí),需要把各種基本數(shù)據(jù)類型組合在一起構(gòu)成一種新的復(fù)合數(shù)據(jù)類型,我們把這種自定義的數(shù)據(jù)類型稱為結(jié)構(gòu)體。結(jié)構(gòu)體是程序員根據(jù)實(shí)際需求數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn),把各種基本數(shù)據(jù)類型組合在一起構(gòu)成的一種新的復(fù)合數(shù)據(jù)類型。

    二、結(jié)構(gòu)體的定義

    結(jié)構(gòu)體的定義方式共有3種,這里只用最常見也最常用的一種方式定義,即:

    結(jié)構(gòu)體名

    {

    成員列表;

    }; // 注意這里的分號(hào)不能省略

    舉個(gè)例子:

    struct Student
    {
    	int age;
    	float score;
    	char gender;
    };
    

    三、結(jié)構(gòu)體變量的定義

    結(jié)構(gòu)體與我們經(jīng)常使用的基本數(shù)據(jù)類型一樣,它也是一種數(shù)據(jù)類型,所以我們可以用這一數(shù)據(jù)類型定義其對(duì)應(yīng)的變量,我們把用結(jié)構(gòu)體類型定義的變量稱為結(jié)構(gòu)體變量。定義結(jié)構(gòu)體變量的方式如下所示:

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu; // 定義結(jié)構(gòu)體變量
    	return 0;
    }

    四、結(jié)構(gòu)體變量的初始化

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu = { 15, 66.5, 'M' }; // 初始化結(jié)構(gòu)體變量
    	return 0;
    }

    五、結(jié)構(gòu)體變量的賦值

    定義結(jié)構(gòu)體變量后,我們可以對(duì)其中的成員進(jìn)行賦值操作,但與初始化不同的是,需要通過結(jié)構(gòu)體變量名.成員名的方式對(duì)結(jié)構(gòu)體變量中的每個(gè)成員單獨(dú)賦值。代碼如下所示

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu; // 定義結(jié)構(gòu)體變量
    	stu.age = 15; 		// 對(duì)結(jié)構(gòu)體變量中的age成員賦值
    	stu.score = 66.5;	// 對(duì)結(jié)構(gòu)體變量中的score成員賦值
    	stu.gender = 'M';	// 對(duì)結(jié)構(gòu)體變量中的gender成員賦值
    	return 0;
    }

    六、引用結(jié)構(gòu)體變量中的成員

    方法1:結(jié)構(gòu)體變量名.成員名

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu;  // 定義結(jié)構(gòu)體變量
    	// 對(duì)各成員賦值
    	stu.age = 15;
    	stu.score = 66.5;
    	stu.gender = 'M';
    	printf("%d %f %c\n", stu.age, stu.score, stu.gender); // 輸出各成員的內(nèi)容
    	return 0;
    }

    方法2:結(jié)構(gòu)體指針變量名->成員名

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu;  // 定義結(jié)構(gòu)體變量
    	struct Student * pStu = &stu; //定義結(jié)構(gòu)體指針變量
    	// 對(duì)各成員賦值
    	pStu->age = 15;
    	pStu->score = 66.5;
    	pStu->gender = 'M';
    	printf("%d %f %c\n", stu.age, stu.score, stu.gender); // 輸出各成員的內(nèi)容
    	return 0;
    }

    方法3:(*結(jié)構(gòu)體指針變量名).成員名

    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char gender;
    };
    int main()
    {
    	struct Student stu; //定義結(jié)構(gòu)體變量
    	struct Student * pStu = &stu; //定義結(jié)構(gòu)體指針變量
    	// 對(duì)各成員賦值
    	(*pStu).age = 15;
    	(*pStu).score = 66.5;
    	(*pStu).gender = 'M';
    	printf("%d %f %c\n", stu.age, stu.score, stu.gender); // 輸出各成員的內(nèi)容
    	return 0;
    }

    七、結(jié)構(gòu)體變量的傳參問題

    當(dāng)我們?cè)谝粋€(gè)函數(shù)中定義了結(jié)構(gòu)體變量,而想要在另外一個(gè)函數(shù)中對(duì)該結(jié)構(gòu)體變量進(jìn)行操作時(shí),則需要向被調(diào)用的函數(shù)傳遞參數(shù)數(shù)據(jù)結(jié)構(gòu)知識(shí)點(diǎn),那傳遞結(jié)構(gòu)體變量作為參數(shù)還是應(yīng)該傳遞結(jié)構(gòu)體指針變量作為參數(shù)呢?這是一個(gè)必須要搞清楚的問題。我以下面的程序?yàn)槔U述不同情況下的傳參問題:

    #include 
    #include 
    struct Student // 定義結(jié)構(gòu)體
    {
    	int age;
    	float score;
    	char name[100];
    };
    // 函數(shù)聲明
    void input_student(struct Student* pStu);
    void output_student(struct Student* pStu);
    int main()
    {
    	struct Student stu; // 定義結(jié)構(gòu)體變量
    	input_student(&stu);	// 傳遞地址的原因詳見該程序下方
    	output_student(&stu);	// 傳遞地址的原因詳見該程序下方
    	return 0;
    }
    // 賦值函數(shù)
    void input_student(struct Student * pStu)
    {
    	(*pStu).age = 10;
    	pStu->score = 66.5;
    	strcpy(pStu->name, "南森"); 
    	/* 
    		注意這里不能寫成 pStu->name = "南森";
    		這是因?yàn)橐痪S數(shù)組名是指針常量,不能對(duì)常量進(jìn)行賦值操作
    	*/
    }
    // 輸出函數(shù)
    void output_student(struct Student* pStu)
    {
    	printf("%d %f %s\n", (*pStu).age, pStu->score, pStu->name);
    }

    為什么要傳遞地址?由于函數(shù)要修改主函數(shù)中結(jié)構(gòu)體變量stu各個(gè)成員的值,所以只能傳輸地址,不能傳輸變量stu,我已經(jīng)在《C語言之指針知識(shí)大總結(jié)》這篇文章中詳細(xì)敘述了其中的原因。而函數(shù)并不需要修改主函數(shù)中結(jié)構(gòu)體變量stu各個(gè)成員的值,所以此時(shí)是可以傳輸變量stu的,但由于變量stu的類型是結(jié)構(gòu)體類型,其所占字節(jié)數(shù)較多,而所有的指針變量都只有四個(gè)字節(jié),所以為了減少內(nèi)存耗用并提高數(shù)據(jù)傳輸?shù)男剩鶄鬏攲?duì)應(yīng)的結(jié)構(gòu)體指針變量。

    八、傳輸?shù)刂穾淼膯栴}

    向一個(gè)函數(shù)傳入某個(gè)變量的地址不僅可以修改該變量的值,而且可以提高數(shù)據(jù)傳輸效率,但這樣做也會(huì)有一定的風(fēng)險(xiǎn)。例如上一小結(jié)中的程序,其中的函數(shù)作為輸出函數(shù)并不需要在其內(nèi)部修改變量的值,而一旦傳入變量的地址,那就意味著函數(shù)也可以對(duì)該地址所對(duì)應(yīng)的變量進(jìn)行修改,這樣就導(dǎo)致這個(gè)函數(shù)非常不安全,那怎么樣才能實(shí)現(xiàn)既可以快速傳輸數(shù)據(jù),又可以在不需要修改變量值的函數(shù)中禁止該函數(shù)修改數(shù)據(jù)呢?答案很簡(jiǎn)單,只需要在形參的指針變量前加上關(guān)鍵字const就可以達(dá)到這樣的目的。如下所示:

    void output_student(const struct Student* pStu)
    {
    	pStu->score = 88; // 錯(cuò)誤,因?yàn)橹羔樧兞縫Stu前有const修飾,無法修改其對(duì)應(yīng)的普通變量的值
    	(*pStu).age = 10; // 錯(cuò)誤,因?yàn)橹羔樧兞縫Stu前有const修飾,無法修改其對(duì)應(yīng)的普通變量的值
    	printf("%d %f %s\n", (*pStu).age, pStu->score, pStu->name);
    }
    

    九、動(dòng)態(tài)結(jié)構(gòu)體數(shù)組

    #include 
    #include 
    // 定義結(jié)構(gòu)體
    struct Student
    {
    	char name[100];
    	int age;
    	float score;
    };
    // 函數(shù)聲明
    int create_array(struct Student**);
    void input_array(struct Student*, int);
    void bubble_sort(struct Student*, int);
    void print(struct Student*, int);
    int main()
    {
    	int length;
    	struct Student* pStu;
    	length = create_array(&pStu); // 由于要對(duì)指針變量pStu的內(nèi)容進(jìn)行修改,所以只能傳輸其地址
    	input_array(pStu, length);
    	bubble_sort(pStu, length);
    	print(pStu, length);
    	return 0;
    }
    // 該函數(shù)的作用是分配內(nèi)存并構(gòu)造數(shù)組
    int create_array(struct Student** q) // 由于需要接收一級(jí)指針變量,所以這里需要使用二級(jí)指針
    {
    	int length;
    	printf("請(qǐng)輸入學(xué)生人數(shù):");
    	scanf("%d", &length);
    	printf("\n");
    	*q = (struct Student*)malloc(sizeof(struct Student) * length); // 動(dòng)態(tài)分配內(nèi)存構(gòu)造結(jié)構(gòu)體數(shù)組
    	return length;
    }
    // 該函數(shù)的作用是對(duì)結(jié)構(gòu)體數(shù)組中的各元素進(jìn)行賦值
    void input_array(struct Student* p, int length)
    {
    	int i;
    	for (i = 0; i < length; i++)
    	{
    		printf("請(qǐng)輸入第%d個(gè)學(xué)生的信息:\n", i + 1);
    		printf("姓名:");
    		scanf("%s", (p + i)->name);
    		printf("年齡:");
    		scanf("%d", &(*(p + i)).age);
    		printf("成績(jī):");
    		scanf("%f", &p[i].score);
    		printf("\n");
    	}
    }
    // 該函數(shù)的作用是按照結(jié)構(gòu)體數(shù)組中的score成員從低到高進(jìn)行冒泡排序
    void bubble_sort(struct Student* p, int length)
    {
    	int i, j;
    	struct Student t;
    	for (i = 1; i < length; i++)
    		for (j = 0; j < length - i; j++)
    			if (p[j].score > p[j + 1].score)
    			{	
    				// 注意:比較的是score的大小,但是需要交換的是結(jié)構(gòu)體數(shù)組中元素的位置,而不是只交換成員score
    				t = p[j];
    				p[j] = p[j + 1];
    				p[j + 1] = t;
    			}
    }
    // 該函數(shù)的作用是輸出結(jié)構(gòu)體數(shù)組中各元素的內(nèi)容
    void print(struct Student* p, int length)
    {
    	int i;
    	printf("按照分?jǐn)?shù)由低到高排序的結(jié)果為:\n");
    	for (i = 0; i < length; i++)
    	{
    		printf("姓名:%s\n", (p + i)->name);
    		printf("年齡:%d\n", (*(p + i)).age);
    		printf("成績(jī):%f\n", p[i].score);
    		printf("\n");
    	}
    }

    十、關(guān)鍵字

    關(guān)鍵字的作用是對(duì)數(shù)據(jù)類型起別名。例如:

    #include 
    typedef int INTEGER; // 給int取了個(gè)別名叫INTEGER,故INTEGER就等同于int
    int main()
    {
    	INTEGER i = 10; // 等同于 int i = 10;
    	return 0;
    }

    #include 
    typedef struct Student
    {
    	char name[100];
    	int age;
    	float score;
    }ST, * PST; // 給 struct Student 起了個(gè)別名ST,給 struct Student * 起了個(gè)別名叫PST
    int main()
    {
    	ST stu;		// 等同于 struct Student stu;
    	PST pStu;	// 等同于 ST * pStu; 也等同于 struct Student * pStu;
    	return 0;
    }

    十一、C++中的引用

    使用C++中的引用在向其它函數(shù)傳參時(shí)可以幫助我們提高編碼效率,嚴(yán)蔚敏老師在《數(shù)據(jù)結(jié)構(gòu)》這本書中也多次使用了C++中的引用。

    傳輸普通變量

    C語言實(shí)現(xiàn)普通變量的傳輸:

    #include 
    void modify(int* p)
    {
    	(*p)++;
    }
    int main()
    {
    	int i = 10;
    	modify(&i);
    	printf("%d\n", i);
    	return 0;
    }

    C++語言實(shí)現(xiàn)普通變量的傳輸:

    #include 
    void modify(int& i)
    {
    	i++;
    }
    int main()
    {
    	int i = 10;
    	modify(i);
    	printf("%d\n", i);
    	return 0;
    }

    傳輸指針變量

    C語言實(shí)現(xiàn)指針變量的傳輸:

    #include 
    #include 
    void modify(int** q)
    {
    	*q = (int *)malloc(sizeof(int));
    }
    int main()
    {
    	int * p;
    	modify(&p);
    	return 0;
    }

    C++語言實(shí)現(xiàn)指針變量的傳輸:

    #include 
    #include 
    void modify(int*& p)
    {
    	p = (int *)malloc(sizeof(int));
    }
    int main()
    {
    	int * p;
    	modify(p);
    	return 0;
    }

    到此這篇關(guān)于C語言全面梳理結(jié)構(gòu)體知識(shí)點(diǎn)的文章就介紹到這了,更多相關(guān)C語言結(jié)構(gòu)體內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

網(wǎng)站首頁   |    關(guān)于我們   |    公司新聞   |    產(chǎn)品方案   |    用戶案例   |    售后服務(wù)   |    合作伙伴   |    人才招聘   |   

友情鏈接: 餐飲加盟

地址:北京市海淀區(qū)    電話:010-     郵箱:@126.com

備案號(hào):冀ICP備2024067069號(hào)-3 北京科技有限公司版權(quán)所有