0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語言_結(jié)構(gòu)體總結(jié)

DS小龍哥-嵌入式技術(shù) ? 來源:DS小龍哥-嵌入式技術(shù) ? 作者:DS小龍哥-嵌入式技 ? 2022-08-14 09:52 ? 次閱讀

當前文章介紹動態(tài)堆空間內(nèi)存分配與釋放,C語言結(jié)構(gòu)體定義、初始化、賦值、結(jié)構(gòu)體數(shù)組、結(jié)構(gòu)體指針的相關(guān)知識點,最后通過一個學(xué)生管理系統(tǒng)綜合練習(xí)結(jié)構(gòu)體數(shù)組的使用。

1. 動態(tài)內(nèi)存管理

C語言代碼----->編譯----->鏈接------>可執(zhí)行的二進制文件(windows下xxx.exe)
二進制文件中的數(shù)據(jù)是如何擺放的? 文本數(shù)據(jù)段、靜態(tài)數(shù)據(jù)段、全局數(shù)據(jù)段。

堆??臻g: 代碼在運行的時候才有的空間。
??臻g: 系統(tǒng)負責申請,負責釋放。比如: 函數(shù)形參變量、數(shù)組……
堆空間: 程序員負責申請,負責釋放。

#include      //標準庫頭文件
void *malloc(int size); //內(nèi)存申請。 形參表示申請的空間大小,返回值:申請的空間的地址
void free(void *p);     //內(nèi)存釋放。 形參就是要釋放的空間首地址。

動態(tài)空間申請示例。

動態(tài)空間申請
#include "stdio.h"
#include "string.h"
#include 
int main()
{
	int *p=malloc(sizeof(int)); //申請空間
	if(p!=NULL)
	{
		printf("申請的空間地址: 0x%X\n",p);
		*p=888;
		printf("%d\n",*p);
	}
	free(p); //釋放空間
 	return 0;
}
示例2:
#include "stdio.h"
#include "string.h"
#include 

char *func(void)
{
	char*str=malloc(100); //char str[100];
	if(str!=NULL)
	{
		strcpy(str,"1234567890");
		printf("子函數(shù)打印:%s\n",str);
		//free(str); //釋放空間
		return str;
	}
	else
	{
		return NULL;
	}
}

int main()
{
	char *p=func();
	printf("主函數(shù)打印:%s\n",p);
 	return 0;
}

2. 結(jié)構(gòu)體

2.1 定義語法

結(jié)構(gòu)體的概念: 可存放不同數(shù)據(jù)類型的集合。
比如: 存放一個班級學(xué)生的信息
可以使用一個結(jié)構(gòu)體存放一個學(xué)生的信息。
一個結(jié)構(gòu)體數(shù)組存放整個班級的學(xué)習(xí)信息。
數(shù)組的概念: 可存放相同數(shù)據(jù)類型的集合。

結(jié)構(gòu)體的定義語法:

//聲明一種新類型-----數(shù)據(jù)類型
struct <結(jié)構(gòu)體的名稱>
{
	<結(jié)構(gòu)體的成員>1;
<結(jié)構(gòu)體的成員>2;
…………
};  //最后有分號結(jié)束

struct MyStruct 
{
	char a;
	int b;
	float c;
	char str[100];
};

2.2 定義示例

結(jié)構(gòu)體如何賦值? 如何訪問結(jié)構(gòu)體內(nèi)部成員

#include "stdio.h"
#include "string.h"
#include 

//定義結(jié)構(gòu)體數(shù)據(jù)類型
struct MyStruct
{
	char a;
	int b;
	float c;
	char str[100];
};
int main()
{
	struct MyStruct data={'A',123,456.789,"abcd"}; //data就是結(jié)構(gòu)體類型的變量
	//結(jié)構(gòu)體變量訪問內(nèi)部成員的語法:  . 點運算符
	printf("%c\n",data.a);
	printf("%d\n",data.b);
	printf("%f\n",data.c);
	printf("%s\n",data.str);
 	return 0;
}

2.3 初始化

#include "stdio.h"
#include "string.h"
#include 

//定義結(jié)構(gòu)體數(shù)據(jù)類型
struct MyStruct
{
	char a;
	int b;
	float c;
	char str[100];
}data={'A',123,456.789,"abcd"}; //data就是結(jié)構(gòu)體類型的變量

int main()
{
	//結(jié)構(gòu)體變量訪問內(nèi)部成員的語法:  . 點運算符
	printf("%c\n",data.a);
	printf("%d\n",data.b);
	printf("%f\n",data.c);
	printf("%s\n",data.str);
 	return 0;
}

2.4 結(jié)構(gòu)體賦值

  //結(jié)構(gòu)體變量訪問內(nèi)部成員的語法:  . 點運算符
#include "stdio.h"
#include "string.h"
#include 

//定義結(jié)構(gòu)體數(shù)據(jù)類型
struct MyStruct
{
	char a;
	int b;
	float c;
	char str[100];
}; 

int main()
{
	struct MyStruct data;//data就是結(jié)構(gòu)體類型的變量
	//成員單獨賦值
	data.a='A';
	data.b=123;
	data.c=456.789;
	strcpy(data.str,"abcd"); //數(shù)組賦值

	//結(jié)構(gòu)體變量訪問內(nèi)部成員的語法:  . 點運算符
	printf("%c\n",data.a);
	printf("%d\n",data.b);
	printf("%f\n",data.c);
	printf("%s\n",data.str);
 	return 0;
}

2.5 結(jié)構(gòu)體數(shù)組

結(jié)構(gòu)體賦值分為兩種標準:  C89 、C99
?結(jié)構(gòu)體數(shù)組
#include "stdio.h"
#include "string.h"
#include 

//定義結(jié)構(gòu)體數(shù)據(jù)類型
struct MyStruct
{
	char a;
	int b;
	float c;
	char str[100];
}; 

int main()
{
	struct MyStruct data[100];//data就是結(jié)構(gòu)體數(shù)組類型變量
	struct MyStruct data2[50];

    //成員單獨賦值
	data[0].a='A';
	data[0].b=123;
	data[0].c=456.789;
	strcpy(data[0].str,"abcd"); //數(shù)組賦值

	//結(jié)構(gòu)體變量訪問內(nèi)部成員的語法:  . 點運算符
	printf("%c\n",data[0].a);
	printf("%d\n",data[0].b);
	printf("%f\n",data[0].c);
	printf("%s\n",data[0].str);
 	return 0;
}

2.6 結(jié)構(gòu)體指針賦值

#include "stdio.h"
#include "string.h"
#include 
//定義結(jié)構(gòu)體數(shù)據(jù)類型
struct MyStruct
{
	char a;
	int b;
	float c;
	char str[100];
}; 

int main()
{
	//struct MyStruct buff[100];
	//struct MyStruct *data=buff; //結(jié)構(gòu)體指針類型變量

	struct MyStruct *data=malloc(sizeof(struct MyStruct));
	data->a='A';
	data->b=123;
	data->c=456.789;
	strcpy(data->str,"abcd");

	//結(jié)構(gòu)體指針訪問內(nèi)部成員的變量 通過  ->  運算符。 
	printf("%c\n",data->a);
	printf("%d\n",data->b);
	printf("%f\n",data->c);
	printf("%s\n",data->str);
 	return 0;
}

3. 學(xué)生管理系統(tǒng)

作業(yè): 學(xué)生管理系統(tǒng)

需求: (每一個功能都是使用函數(shù)進行封裝)
1.實現(xiàn)從鍵盤上錄入學(xué)生信息。 (姓名、性別、學(xué)號、成績、電話號碼)
2.將結(jié)構(gòu)體里的學(xué)生信息全部打印出來。
3.實現(xiàn)根據(jù)學(xué)生的姓名或者學(xué)號查找學(xué)生,查找到之后打印出學(xué)生的具體信息。
4.根據(jù)學(xué)生的成績對學(xué)生信息進行排序。
5.根據(jù)學(xué)號刪除學(xué)生信息。

示例:

#include "stdio.h"
#include "string.h"
#include 

//定義存放學(xué)生信息的結(jié)構(gòu)體類型
struct StuDentInfo
{
	char Name[20]; //姓名
	int number;    //學(xué)號
	char phone[20];//電話號碼
}; 

//全局變量區(qū)域
unsigned int  StuDentCnt=0; //記錄已經(jīng)錄入的全部學(xué)生數(shù)量

//函數(shù)聲明區(qū)域
void PrintStuDentInfoList(void);
void InputStuDentInfo(struct StuDentInfo*info);
void FindStuDentInfo(struct StuDentInfo*info);
void SortStuDentInfo(struct StuDentInfo*info);
void PrintStuDentInfo(struct StuDentInfo*info);

int main()
{
	struct StuDentInfo data[100]; //可以100位學(xué)生的信息
	int number;
	while(1)
	{
		PrintStuDentInfoList(); //打印功能列表
		scanf("%d",&number);
		printf("\n");
		switch(number)
		{
		case 1:
			InputStuDentInfo(data);
			break;
		case 2:
			FindStuDentInfo(data);
			break;
		case 3:
			SortStuDentInfo(data);
			break;
		case 4:
			PrintStuDentInfo(data);
			break;
		case 5:
			break;
		default:
			printf("選擇錯誤!\n\n");
			break;
		}
	}
 	return 0;
}

/*
函數(shù)功能: 打印學(xué)生管理系統(tǒng)的功能列表
*/
void PrintStuDentInfoList(void)
{
	printf("\n--------------學(xué)生管理系統(tǒng)功能列表----------------\n");
	printf("1. 錄入學(xué)生信息\n");
	printf("2. 根據(jù)學(xué)號查找學(xué)生信息\n");
	printf("3. 根據(jù)學(xué)號排序\n");
	printf("4. 打印所有學(xué)生信息\n");
	printf("5. 刪除指定的學(xué)生信息\n");
	printf("請選擇功能序號:");
}

/*
函數(shù)功能: 錄入學(xué)生信息
*/
void InputStuDentInfo(struct StuDentInfo*info)
{
	printf("輸入學(xué)生姓名:");
	scanf("%s",info[StuDentCnt].Name);
	printf("輸入學(xué)號:");
	scanf("%d",&info[StuDentCnt].number);
	printf("輸入電話號碼:");
	scanf("%s",info[StuDentCnt].phone);
	StuDentCnt++; //數(shù)量自增
}

/*
函數(shù)功能: 查找學(xué)生信息
*/
void FindStuDentInfo(struct StuDentInfo*info)
{
	int num,i;
	printf("輸入查找的學(xué)號:");
	scanf("%d",&num);
	for(i=0; iinfo[j+1].number)
			{
				tmp=info[j];
				info[j]=info[j+1];
				info[j+1]=tmp;
			}
		}
	}
}

/*
函數(shù)功能: 打印所有學(xué)生信息
*/
void PrintStuDentInfo(struct StuDentInfo*info)
{
	int i=0;
	printf("-----------所有學(xué)生的信息列表------------\n");
	for(i=0;i

;i++)>;>
聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • C語言
    +關(guān)注

    關(guān)注

    180

    文章

    7575

    瀏覽量

    134048
  • 結(jié)構(gòu)體
    +關(guān)注

    關(guān)注

    1

    文章

    127

    瀏覽量

    10800
收藏 人收藏

    評論

    相關(guān)推薦

    嵌入式C語言知識點總結(jié)

    怎么才能做好嵌入式開發(fā)?學(xué)好C語言吧!今天就來推薦一篇大佬寫的嵌入式C語言知識點總結(jié)。
    發(fā)表于 09-27 09:53 ?1111次閱讀

    漫談C語言結(jié)構(gòu)

      相信大家對于結(jié)構(gòu)體都不陌生。在此,分享出本人對c語言結(jié)構(gòu)體的學(xué)習(xí)心得。如果你發(fā)現(xiàn)這個總結(jié)中有你以前所未掌握的,那本文也算是有點價值了。當
    發(fā)表于 11-15 15:59

    C語言_指針總結(jié)_經(jīng)典講解

    C語言_指針總結(jié)_經(jīng)典講解。
    發(fā)表于 01-06 13:47 ?10次下載

    dxp整體總結(jié)

    自己整體做了個簡單整體總結(jié),分享給大家,一個dxp的過程,包括常用的快捷鍵,布線,
    發(fā)表于 08-31 16:28 ?0次下載

    C語言字符串操作總結(jié)大全(超詳細)

    本文對c語言字符串的操作進行了詳細的總結(jié)分析,需要的朋友可以參考。
    發(fā)表于 11-15 14:19 ?2016次閱讀

    C語言入門教程之順序結(jié)構(gòu)總結(jié)的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是C語言入門教程之順序結(jié)構(gòu)總結(jié)的詳細資料概述主要內(nèi)容包括了:1 賦值語句2 數(shù)據(jù)輸出3 數(shù)據(jù)輸入4 復(fù)合語句和空語句5 程序舉例
    發(fā)表于 10-23 17:53 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>入門教程之順序<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>總結(jié)</b>的詳細資料概述

    C語言入門教程之循環(huán)結(jié)構(gòu)總結(jié)的詳細資料概述

    本文檔的主要內(nèi)容詳細介紹的是C語言入門教程之循環(huán)結(jié)構(gòu)總結(jié)的詳細資料概述。主要內(nèi)容包括了:1 while語句和用while語句構(gòu)成的循環(huán)結(jié)構(gòu)2
    發(fā)表于 10-23 17:53 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>入門教程之循環(huán)<b class='flag-5'>結(jié)構(gòu)</b><b class='flag-5'>總結(jié)</b>的詳細資料概述

    適合C語言小白看的基礎(chǔ)知識梳理總結(jié)

    C語言是當代人學(xué)習(xí)及生活中的必備基礎(chǔ)知識,應(yīng)用十分廣泛,下面為大家?guī)?b class='flag-5'>C語言基礎(chǔ)知識梳理總結(jié)C
    的頭像 發(fā)表于 01-04 11:07 ?4638次閱讀

    C語言教程之C基礎(chǔ)變量的技術(shù)總結(jié)

    本文檔的主要內(nèi)容詳細介紹的是C語言教程之C基礎(chǔ)變量的技術(shù)總結(jié)。
    發(fā)表于 01-22 16:18 ?11次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>教程之<b class='flag-5'>C</b>基礎(chǔ)變量的技術(shù)<b class='flag-5'>總結(jié)</b>

    總結(jié)那么幾個C語言中的“坑”

    總結(jié)幾個C語言中的“坑”
    的頭像 發(fā)表于 01-16 10:52 ?2477次閱讀

    C語言的拓展歸納總結(jié)詳細說明

    本文檔的主要內(nèi)容詳細介紹的是C語言的拓展歸納總結(jié)詳細說明。
    發(fā)表于 07-29 08:00 ?2次下載
    <b class='flag-5'>C</b><b class='flag-5'>語言</b>的拓展歸納<b class='flag-5'>總結(jié)</b>詳細說明

    嵌入式C語言知識總結(jié)

    1 嵌入式C語言總結(jié)從語法上來說C語言并不復(fù)雜, 但編寫優(yōu)質(zhì)可靠的嵌入式C程序并非易事,不僅需要
    發(fā)表于 12-20 19:44 ?12次下載
    嵌入式<b class='flag-5'>C</b><b class='flag-5'>語言</b>知識<b class='flag-5'>總結(jié)</b>

    C語言C++面試知識點總結(jié)

    相對而言,C語言C++相關(guān)的面試題比較少見,沒有Java方向?qū)懙娜四敲炊?,這是一篇 C 語言C
    的頭像 發(fā)表于 05-12 14:59 ?1359次閱讀

    C語言C++面試知識點總結(jié)

    相對而言,C語言C++相關(guān)的面試題比較少見,沒有Java方向?qū)懙娜四敲炊?,這是一篇 C 語言C
    的頭像 發(fā)表于 05-13 11:59 ?1751次閱讀

    C語言_鏈表總結(jié)

    本篇文章介紹C語言鏈表相關(guān)知識點,涉及鏈表的創(chuàng)建、單向鏈表、循環(huán)鏈表、雙向鏈表、單向循環(huán)鏈表,鏈表常見問題總結(jié)等,還列出了結(jié)構(gòu)體數(shù)組與鏈表的練習(xí)題,將在下篇文章貼出完整代碼。
    的頭像 發(fā)表于 08-14 09:53 ?1684次閱讀