日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

20160221.CCPP体系详解(0031天)

發(fā)布時(shí)間:2025/5/22 编程问答 22 豆豆
生活随笔 收集整理的這篇文章主要介紹了 20160221.CCPP体系详解(0031天) 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

程序片段(01):01.結(jié)構(gòu)體靜態(tài)數(shù)組.c+02.結(jié)構(gòu)體動(dòng)態(tài)數(shù)組.c
內(nèi)容概要:結(jié)構(gòu)體數(shù)組

///01.結(jié)構(gòu)體靜態(tài)數(shù)組.c #include <stdio.h> #include <stdlib.h> #include <string.h>//01.C語(yǔ)言的結(jié)構(gòu)體特點(diǎn): // 1.C語(yǔ)言要求結(jié)構(gòu)體或者共用體至少得有一個(gè)成員 // 也就是說(shuō)C語(yǔ)言并不允許空結(jié)構(gòu)體或者空共用體的出現(xiàn)! // 2.嚴(yán)格區(qū)分采用結(jié)構(gòu)體類型到底定義的是哪種具體變量: // 普通變量+指針變量+數(shù)組變量 struct {//匿名結(jié)構(gòu)體int num; } *pStruct, structArr[10], structVar;//02.定義結(jié)構(gòu)體的不同分類方式: // 1.按照聲明類型和定義變量的時(shí)機(jī)不同: // 聲明結(jié)構(gòu)體類型的同時(shí)定義結(jié)構(gòu)體變量 // 聲明結(jié)構(gòu)體類型之后再定義結(jié)構(gòu)體變量 // 2.按照所屬內(nèi)存空間的不同: // 棧內(nèi)存: // 堆內(nèi)存: // 靜態(tài)區(qū): //注:結(jié)構(gòu)體變量(普通+指針+數(shù)組) struct MyStruct01 {//標(biāo)準(zhǔn)結(jié)構(gòu)體int id;char str[10]; } ms01[10];//03.結(jié)構(gòu)體的兩種常見(jiàn)分類: // 標(biāo)準(zhǔn)結(jié)構(gòu)體:標(biāo)準(zhǔn)情況 // 匿名結(jié)構(gòu)體:鎖定變量變量個(gè)數(shù) //注:要想鎖定變量個(gè)數(shù)就不能使用指針變量: // 因?yàn)獒槍?duì)于結(jié)構(gòu)體指針變量可以進(jìn)行動(dòng)態(tài)內(nèi)存分配,于是就會(huì) // 導(dǎo)致結(jié)構(gòu)體變量數(shù)目的不確定性 //04.結(jié)構(gòu)體初始化: // 1.位于棧內(nèi)存的結(jié)構(gòu)體可以采用如同數(shù)組一樣的靜態(tài)初始化方式 // 2.可以采用靜態(tài)默認(rèn)初始化方式{0}來(lái)將整個(gè)結(jié)構(gòu)體空間清空為0 // 3.如果涉及到結(jié)構(gòu)體數(shù)組的形式,那么最外層{}代表結(jié)構(gòu)體數(shù)組整體 // 內(nèi)層的每一個(gè){}代表一個(gè)結(jié)構(gòu)體變量本身 // 4.如果涉及到一維結(jié)構(gòu)體數(shù)組的初始化操作,想要省略內(nèi)部的{} // 就需要按照結(jié)構(gòu)體變量一個(gè)一個(gè)按照類型一致,順序?qū)?yīng)的關(guān)系 // 完成初始化操作 //05.關(guān)于靜態(tài)初始化: // 1.針對(duì)于所有復(fù)合類型: // 2.最外層{}代表整體: // 內(nèi)層{}一般代表單個(gè),也可代表子整體 //注:任何位于棧內(nèi)存的復(fù)合類型采用指針進(jìn)行指向,都需要進(jìn)行類型轉(zhuǎn)換 // 任何位于棧內(nèi)存的復(fù)合類型都可以采用{0}進(jìn)行整體數(shù)據(jù)清零操作,無(wú)論 // 符合類型的嵌套級(jí)數(shù)-->復(fù)合類型快捷靜態(tài)初始化操作! int main01(void) {struct MyStruct01 ms02[10];struct MyStruct01 * pMS01 = (struct MyStruct01[]) { 0 };//結(jié)構(gòu)體靜態(tài)初始化(默認(rèn)形式)struct MyStruct01 ms03[] = { {10, "20" },{10, "20" },{10, "20"} };struct MyStruct01 * pMS02 = (struct MyStruct01[]) { {10, "20"}, { 10,"20" }, { 10, "20" } };struct MyStruct01 ms04[] = { {0}, {0} };struct MyStruct01 ms05[] = { 0 };struct MyStruct01 ms06[][10] = { 0 };//復(fù)合類型整體初始化system("pause"); }struct CSDN01 {char name[100];char pass[100];char email[100]; } csdnData[10] = {{"zdg", "12344321", "zdg@csdn.net"},{"LaoZheng", "670203313747", "chengming_zheng@163.com"},{"fstao", "730413", "fstao@tom.cn"} }, *pCsdnStruct;//06.關(guān)于數(shù)組的類型以及指向數(shù)組的指針總結(jié): // 1.所有數(shù)組(無(wú)論數(shù)組維度是多少),該數(shù)組的類型都是去掉最高維度數(shù) // 2.所有指向數(shù)組(無(wú)論數(shù)組維度是多少)類型的指針,都是將最高維度變?yōu)?/span> // 數(shù)組指針類型(*pArr) //07.成員選擇: // 指針:箭頭號(hào) // 對(duì)象:點(diǎn)兒號(hào) //注:嚴(yán)格注意運(yùn)算符優(yōu)先級(jí)特性 int main02(void) {pCsdnStruct = (struct CSDN01[]) {{"zdg", "12344321", "zdg@csdn.net"},{"LaoZheng", "670203313747", "chengming_zheng@163.com"},{"fstao", "730413", "fstao@tom.com"}};for (int i = 0; i < sizeof(csdnData) / sizeof(*(csdnData + 0)); ++i){//a.b (&a)->b (*p).b;//char * p = strstr(*(*(csdnData + i)).email, "chengming_zheng@163.com");//char * p = strstr((&csdnData[i])->email, "chengming_zheng@163.com");//char * p = strstr((*(pCsdnStruct + i)).email, "chengming_zheng@163.com");//char * p = strstr((pCsdnStruct + i)->email, "chengming_zheng@163.com");char * p = strstr((*(pCsdnStruct + i)).email, "chengming_zheng@163.com");if (p){puts((*(csdnData + i)).pass);}}system("pause"); } ///02.結(jié)構(gòu)體動(dòng)態(tài)數(shù)組.c #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <malloc.h> #include <memory.h>struct CSDN01 {int id;int num; };//01.靜態(tài)開(kāi)辟和動(dòng)態(tài)回收: // 1.靜態(tài)開(kāi)辟: // (1).內(nèi)存尺寸編譯指定 // (2).未使用內(nèi)存分配函數(shù) // (3).使用的是常量決定尺寸 // (4).只能使用數(shù)組類型作為類型轉(zhuǎn)換(靜態(tài)類型轉(zhuǎn)換) // (5).不可進(jìn)行手動(dòng)回收 // 2.動(dòng)態(tài)開(kāi)辟: // (1).內(nèi)存尺寸運(yùn)行決定 // (2).使用了內(nèi)存分配函數(shù) // (3).可以使用變量決定尺寸 // (4).只能使用指針類型作為類型轉(zhuǎn)換(動(dòng)態(tài)類型轉(zhuǎn)換) // (5).可以進(jìn)行手動(dòng)回收 //02.內(nèi)存清零函數(shù): // 格式:memset(首地址, 數(shù)據(jù), 字節(jié)數(shù)); // 注意:可以指定任意內(nèi)存首地址,尤其注意所需參數(shù)的特點(diǎn) // 是地址層面的意義,不具備指針層面的意義 //03.數(shù)組數(shù)據(jù)的兩種訪問(wèn)方式: // 靜態(tài)訪問(wèn):中括號(hào) // 動(dòng)態(tài)訪問(wèn):點(diǎn)兒號(hào) int main03(void) {int num;scanf("%d", &num);struct CSDN01 * pStruct01 = (struct CSDN01 *)alloca(num * sizeof(struct CSDN01));//棧內(nèi)存struct CSDN01 * pStruct02 = (struct CSDN01 *)malloc(num * sizeof(struct CSDN01));//堆內(nèi)存//內(nèi)存清零函數(shù):memset();memset(pStruct01, 0, sizeof(num * sizeof(struct CSDN01)));memset(pStruct02, 0, sizeof(num * sizeof(struct CSDN01)));//遍歷動(dòng)態(tài)數(shù)組[動(dòng)態(tài)數(shù)組可以像靜態(tài)數(shù)組那樣的引用方式]for (int i = 0; i < num; ++i){//快速初始化:memset();手動(dòng)初始化:賦值操作方式printf("%d, %d\t%d, %d\n", (*(pStruct01 + i)).id = i, (*(pStruct01 + i)).num = i, (*(pStruct02 + i)).id = i, (*(pStruct02 + i)).num = i);}for (int i = 0; i < 10; ++i){//投票次數(shù)int id = 0;scanf("%d", &id);for (int j = 0; j < num; ++j){//具體投票if ((*(pStruct01 + i)).id == id){++(*(pStruct01 + i)).num;++(*(pStruct02 + i)).num;break;}}}for (int i = 0; i < num; ++i){printf("%d, %d\t%d, %d \n", (*(pStruct01 + i)).id, (*(pStruct01 + i)).num, (*(pStruct02 + i)).id, (*(pStruct02 + i)).num);}free(pStruct02);system("pause"); }struct MyStruct01 {int id;char str[10]; };int main04(void) {int num;scanf("%d", &num);struct CSDN01 * pCSDNStruct01 = (struct CSDN01 *)malloc(num * sizeof(struct CSDN01));struct CSDN01 * pCSDNStruct02 = (struct CSDN01[]) { 1, 2, 3, 4 };//靜態(tài)分配printf("%d \n", (*(pCSDNStruct02 + 1)).id);printf("%d \n", (pCSDNStruct02 + 1)->id);struct CSDN01 csdnx = { 10, 20 };struct CSDN01 * pCSDNX = &csdnx;printf("%d \n", (*(pCSDNX)).id);printf("%d \n", pCSDNX->id);system("pause"); }int main05(void) {struct CSDN01 csdnData[100];struct CSDN01 * pCSDNStruct = csdnData;struct CSDN01 csdnDataX[10][10];struct CSDN01(*pArr01)[10] = csdnDataX;struct CSDN01(*pArr02)[10] = (struct CSDN01(*)[10])malloc(50 * sizeof(struct CSDN01));pArr02[3][4];system("pause"); }

程序片段(02):結(jié)構(gòu)體大小.c
內(nèi)容概要:結(jié)構(gòu)體大小

#include <stdio.h> #include <stdlib.h>//01.關(guān)于結(jié)構(gòu)體內(nèi)存字節(jié)對(duì)齊的相關(guān)知識(shí): // 1.明確基本數(shù)據(jù)類型: // char short int long float double long long long double // (通常情況之下:double和long long尺寸一樣) // 2.結(jié)構(gòu)體的內(nèi)存尺寸一定是大于或者等于所有成員標(biāo)準(zhǔn)尺寸之和 // 3.結(jié)構(gòu)體內(nèi)存字節(jié)準(zhǔn)確判定方式: // (1).確定基本對(duì)齊尺寸: // 編譯器指定尺寸+基本數(shù)據(jù)類型最寬尺寸(兩者取最短) // (2).準(zhǔn)確判定內(nèi)存字節(jié)尺寸: // 方式一: // 結(jié)構(gòu)體最終尺寸必須可以整除對(duì)齊尺寸 // 結(jié)構(gòu)體成員的首地址-結(jié)構(gòu)體的首地址=偏移量(該偏移量必須是當(dāng)前成員尺寸的整數(shù)倍) // 結(jié)構(gòu)體對(duì)齊單元的末尾不足部分,會(huì)被默認(rèn)填充 // 方式二: // 所有結(jié)構(gòu)體在內(nèi)存當(dāng)中的存儲(chǔ)形式是矩形方式 // 矩形的寬度為對(duì)齊內(nèi)存尺寸 // 放進(jìn)矩形的的成員相對(duì)位置必須能夠整除自身尺寸 // 4.結(jié)構(gòu)體如果只是存在單個(gè)成員的情況,根本就不存在結(jié)構(gòu)體內(nèi)存字節(jié)對(duì)齊問(wèn)題: // 所以此時(shí)的結(jié)構(gòu)體尺寸就是結(jié)構(gòu)體當(dāng)中的第一個(gè)成員的尺寸 // 5.結(jié)構(gòu)體內(nèi)存字節(jié)對(duì)齊的優(yōu)點(diǎn): // (1).便于快速尋址 // (2).便于節(jié)約內(nèi)存 // 6.結(jié)構(gòu)體內(nèi)存字節(jié)優(yōu)化方式: // 1.首先確定基本數(shù)據(jù)類型最寬的成員: // (包含結(jié)構(gòu)體多層嵌套都生效的最寬基本成員) // 2.結(jié)構(gòu)體矩形的形成順序,務(wù)必按照從內(nèi)到外,從前到 // 后的順序進(jìn)行確定 // 3.并且每個(gè)結(jié)構(gòu)體矩形成員必須是獨(dú)立矩形! // 4.再其次定義基本數(shù)據(jù)類型最寬的成員 // (按照不同結(jié)構(gòu)體單元進(jìn)行分類順序考慮) // 5.再其次考慮各個(gè)結(jié)構(gòu)體當(dāng)中當(dāng)中的數(shù)組數(shù)據(jù)類型和數(shù)據(jù)類型最寬的成員關(guān)系 // 數(shù)組尺寸和對(duì)齊字節(jié)數(shù)之間的關(guān)系 // 6.再逐個(gè)按照基本數(shù)據(jù)類型寬度尺寸遞減的方式定義成員 // 注意:每個(gè)獨(dú)立的結(jié)構(gòu)體都是按照矩形形式存儲(chǔ)的! // 這個(gè)矩形的寬度就是所有結(jié)構(gòu)體當(dāng)中數(shù)據(jù)類型最寬的那個(gè)成員 // (嵌套結(jié)構(gòu)體必須保證每個(gè)結(jié)構(gòu)體自身先形成矩形,從內(nèi)到外進(jìn)行矩形確定) struct MyStruct01 {//默認(rèn)順序char chr1;//8double db2;//8int num3;//8char chr4;double db5;//8 };struct MyStruct02 {//節(jié)省順序double db2;//8double db5;//8int num3;//8char chr1;char chr4; };struct MyStruct03 {//單成員結(jié)構(gòu)體不存在結(jié)構(gòu)體內(nèi)存字節(jié)對(duì)齊問(wèn)題char num1;//double num4; };int main01(void) {struct MyStruct01 ms01;struct MyStruct02 ms02;printf("sizeof(ms01) = %d \n", sizeof(ms01));//32-->默認(rèn)存儲(chǔ)printf("sizeof(ms02) = %d \n", sizeof(ms02));//24-->節(jié)省存儲(chǔ)printf("&ms01 = %p \n", &ms01);printf("&ms01.chr1 = %p \n", &ms01.db2);printf("&ms01.db2 = %p \n", &ms01.db2);printf("&ms01.num3 = %p \n", &ms01.num3);printf("&ms01.chr4 = %p \n", &ms01.chr4);printf("&ms01.db5 = %p \n", &ms01.db5);system("pause"); }

程序片段(03):01.Test.c+02.結(jié)構(gòu)體結(jié)構(gòu)體數(shù)組副本機(jī)制.c+03.指針與結(jié)構(gòu)體.c
內(nèi)容概要:結(jié)構(gòu)體成員與指針

///01.Test.c #include <stdio.h> #include <stdlib.h>//01.結(jié)構(gòu)體占用字節(jié)統(tǒng)計(jì): // 1.確定內(nèi)存字節(jié)對(duì)齊數(shù): // 編譯器指定+基本數(shù)據(jù)類型最寬成員(兩者取較短那個(gè)) // 注:包括嵌套形式情況下的結(jié)構(gòu)體數(shù)據(jù)類型最寬成員 // 2.從外往內(nèi),從前往后分析結(jié)構(gòu)體嵌套形式: // 注:任何一個(gè)獨(dú)立的結(jié)構(gòu)體本身一定是按照矩形結(jié)構(gòu)存儲(chǔ)的 // 結(jié)構(gòu)體嵌套結(jié)構(gòu)體-->類似于寬度相同的矩形嵌套 // 3.任何結(jié)構(gòu)體成員的的起始位置減去相對(duì)矩形左外邊的尺寸 // 一定是當(dāng)前結(jié)構(gòu)體成員字節(jié)的整數(shù)倍-->如果當(dāng)前矩形行能夠 // 存儲(chǔ)下當(dāng)前結(jié)構(gòu)體成員,則存下,如果當(dāng)前矩形行存儲(chǔ)不下,則 // 換下一個(gè)矩形行,當(dāng)前矩形行的其余位置空置 //02.結(jié)構(gòu)體占用字節(jié)優(yōu)化: // 1.確定內(nèi)存字節(jié)對(duì)齊數(shù): // 1.編譯器指定+基本數(shù)據(jù)類型最寬成員(兩者取較短那個(gè)) // 2.這個(gè)內(nèi)存字節(jié)對(duì)齊數(shù)用于確定每個(gè)獨(dú)立結(jié)構(gòu)體的矩形寬度 // 注:包括嵌套形式情況下的結(jié)構(gòu)體基本數(shù)據(jù)類型最寬成員! // 2.從外往內(nèi),從前往后進(jìn)行嵌套結(jié)構(gòu)體的內(nèi)存字節(jié)對(duì)齊優(yōu)化: // 3.先安置與內(nèi)存字節(jié)對(duì)齊數(shù)相同的基本數(shù)據(jù)類型成員 // 4.再考慮結(jié)構(gòu)體類型的成員安置情況 // 5.再考慮數(shù)組類型的成員安置情況,這個(gè)需要與內(nèi)存字節(jié)對(duì)齊數(shù) // 進(jìn)行綜合考慮 // 6.在依次考慮基本數(shù)據(jù)類型當(dāng)中從大到小的基本你數(shù)據(jù)類型安置 struct {char chr1;//8--1--7double db2;//8--8--0int num3;//8--4--0char chr4;//0--1--0short num5;//0--2--1char chr6;//8--1--7long long num7;//8--8--0 } anonymity01;//40=25+15struct {long long num7;//8-8-0double db2;//8-8-0int num3;//8-4-0short num5;//0--2--0char chr1;//0--1--0char chr4;//0--1--0char chr6;//8--1-7 } anonymity02;//32=25+7int main01(void) {printf("sizeof(anonymity01) = %d \n", sizeof(anonymity01));printf("sizeof(anonymity02) = %d \n", sizeof(anonymity02));system("pause"); } ///02.結(jié)構(gòu)體結(jié)構(gòu)體數(shù)組副本機(jī)制.c #include <stdio.h> #include <stdlib.h>struct MyStruct01 {int arr[10];int len; };void change(struct MyStruct01 ms01) {printf("change:ms01.arr = %p \n", ms01.arr);for (int i = 0; i < ms01.len; ++i){*((ms01.arr) + i) = i * 3;printf("%3d", *((ms01.arr) + i));}printf("\n"); }//01.符合類型都可以使用靜態(tài)初始化方式: // 靜態(tài)初始化方式-->大括號(hào){} int main02(void) {struct MyStruct01 ms01 = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 10 };change(ms01);printf("main:ms01.arr = %p \n", ms01.arr);for (int i = 0; i < ms01.len; ++i){printf("%3d", *(ms01.arr + i));}system("pause"); }//02.函數(shù)副本機(jī)制: // 1.函數(shù)的形參和返回值都具備副本機(jī)制 // 2.只是該副本機(jī)制針對(duì)于數(shù)組類型進(jìn)行了優(yōu)化: // 函數(shù)副本機(jī)制唯一對(duì)數(shù)組特殊,采用的是退化指針的解決方案 //03.關(guān)于各種取地址符運(yùn)算的結(jié)果: // 1.對(duì)一維數(shù)組當(dāng)中所存儲(chǔ)的元素: // 獲取的是列指針 // 2.對(duì)一維數(shù)組整體(數(shù)組名稱) // 獲取的行指針 // 3.對(duì)任意數(shù)組名稱執(zhí)行取地址運(yùn)算符: // 獲取的都是指向數(shù)組的指針(數(shù)組指針) //04.如何確定數(shù)組的類型以及指向數(shù)組的指針? // 1.所有數(shù)組的類型: // 去掉數(shù)組名+去掉最高維度系數(shù) // 2.指向數(shù)組的指針: // 替換數(shù)組名為(*pArr),pArr就是指向數(shù)組的指針 // 3.如何確定數(shù)組名類型: // 去掉數(shù)組名+替換最高維度(包含中括號(hào)以及維度數(shù))為(*),此時(shí)就是數(shù)組名的變量類型 //注:嚴(yán)格區(qū)分?jǐn)?shù)組名的變量類型和常量類型 struct MyStruct01 testReturn() {struct MyStruct01 ms01 = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }, 10 };printf("testReturn:ms01.arr = %p;ms01.arr + 1 = %p \n", ms01.arr, ms01.arr + 1);printf("testReturn:&ms01.arr = %p;&ms01.arr + 1 = %p \n", &ms01.arr, &ms01.arr + 1);return ms01; }//05.函數(shù)的返回值不能是數(shù)組類型: // 但可以是指向數(shù)組的指針類型 typedef int * intP;//int類型的指針 typedef int intArr[10];//int類型的數(shù)組 //int[] returnUnit()//數(shù)組類型-->錯(cuò)誤 //intArr returnUnit()//數(shù)組類型-->錯(cuò)誤 intP returnUnit(){}int main03(void) {struct MyStruct01 ms01 = testReturn();for (int i = 0; i < ms01.len; ++i){printf("%3d", *(ms01.arr + i));}printf("\n");system("pause"); }struct info {char name[10];int age; }; struct info infos[3]; struct info infos[]; struct info * pInfo; void changeInfo(struct info * pInfo) {//數(shù)組名作為函數(shù)形參將會(huì)退化和數(shù)組名相同的變量指針類型//pInfo = pInfo + 3;(*(pInfo + 1)).age = 88; }//06.通過(guò)結(jié)構(gòu)體來(lái)描述結(jié)構(gòu)體動(dòng)態(tài)數(shù)組: // 結(jié)構(gòu)體可以用于描述任何數(shù)據(jù)類型 struct data {struct info * pArr;//數(shù)組首元素變量指針int len; };int main04(void) {struct info infos[3] = { {"fang", 18}, {"hua", 19}, {"lin", 19} };//infos = infos;changeInfo(infos);for (int i = 0; i < 3; ++i){printf("%s, %d \n", (*(infos + i)).name, (*(infos + i)).age);}system("pause"); } ///03.指針與結(jié)構(gòu)體.c #include <stdio.h> #include <stdlib.h> #include <malloc.h>struct Data01 {int num; };int main05(void) {//int intArr[3][4];//intArr:數(shù)組名的常量指針形式int(*intArr)[4] = {0};//intArr:數(shù)組名的變量指針形式//int * [4];//指針數(shù)組形式printf("intArr:%p, intArr+1:%p \n", intArr, intArr + 1);struct Data01(*pArr)[10] = malloc(90 * sizeof(struct Data01));//動(dòng)態(tài)分配一個(gè)標(biāo)準(zhǔn)的二維結(jié)構(gòu)體數(shù)組int k = 0;for (int i = 0; i < 9; ++i){for (int j = 0; j < 10; ++j){//printf("%3d", pArr[i][j].num = ++k);printf("%3d", (*(*(pArr + i) + j)).num = ++k);}printf("\n");}system("pause"); }int main06(void) {struct Data01 **pp;//結(jié)構(gòu)體鋸齒數(shù)組pp = (struct Data01 **)malloc(10 * sizeof(struct Data01 *));int k = 1;for (int i = 0; i < 10; ++i){*(pp + i) = (struct Data01 *)malloc((i) * sizeof(struct Data01));for (struct Data01 * pStruct = *(pp + i); pStruct <= *(pp + i) + i; ++pStruct){printf("%3d", (*pStruct).num = k++);}printf("\n");}system("pause"); }int main07(void) {//struct Data01 * pStruct = (struct Data01 *)alloca(10 * sizeof(struct Data01));//棧內(nèi)存-->動(dòng)態(tài)分配struct Data01 * pStruct = (struct Data01 *)malloc(sizeof(struct Data01) * 10);//堆內(nèi)存-->動(dòng)態(tài)分配int i = 1;for (struct Data01 * pTemp = pStruct; pTemp < pStruct + 10; ++pTemp){printf("%p, %d \n", pTemp, (*pTemp).num = i++);}system("pause"); }

程序片段(04):位域.c
內(nèi)容概要:位域

#include <stdio.h> #include <stdlib.h>//01.位域:通過(guò)限定數(shù)據(jù)的存儲(chǔ)位數(shù),從而實(shí)現(xiàn)節(jié)省內(nèi)存占用 // 位域-->指定存儲(chǔ)位數(shù)-->節(jié)省內(nèi)存|顯二進(jìn)制位 //02.在操作二進(jìn)制位運(yùn)算的過(guò)程當(dāng)中,一定要注意到符號(hào)位的特點(diǎn) // 1.位域結(jié)構(gòu)體有其自身的數(shù)據(jù)存儲(chǔ)方式和解析方式 // 2.可以進(jìn)行數(shù)據(jù)的分批次存儲(chǔ) struct MyStruct01 {unsigned int a : 5;//00~31[2^5=32]unsigned int b : 5;//00~12[2^4=16]unsigned int c : 16;//0000[2^16] };//4int main01(void) {printf("sizeof(struct MyStruct01) = %d \n", sizeof(struct MyStruct01));struct MyStruct01 ms1, *pStruct;pStruct = &ms1;ms1.a = 8;//位域-->壓縮內(nèi)存-->操作二進(jìn)制位-->效率高ms1.b = 11;ms1.c = 1999;//存儲(chǔ)數(shù)據(jù)都一樣,解析方式不同printf("%d ,%d, %d \n", ms1.a, ms1.b, ms1.c);printf("%d, %d ,%d \n", pStruct->a, pStruct->b, pStruct->c);system("pause"); }struct Data01 {unsigned short num1 : 1;unsigned short num2 : 2; };//2//03.位域結(jié)構(gòu)體在進(jìn)行數(shù)據(jù)的分批次存儲(chǔ)的時(shí)候: // 1.注意有無(wú)符號(hào)的影響 // 2.注意數(shù)據(jù)越界的情況: // 如果出現(xiàn)越界,就只會(huì)解析界限以內(nèi)的數(shù)據(jù) int main02(void) {printf("sizeof(struct Data01) = %d \n", sizeof(struct Data01));struct Data01 data01;data01.num1 = 2;//數(shù)據(jù)越界2-->二進(jìn)制-->10-->顯示0printf("%d \n", data01.num1);system("pause"); }//04.只有位域才有可能出現(xiàn)按照數(shù)據(jù)類型進(jìn)行合并的情況 // 同類型+不越界=>內(nèi)存壓縮 struct Data02 {unsigned int num1 : 32;unsigned short num2 : 1; };//8int main03(void) {printf("%d \n", sizeof(struct Data02));system("pause"); }int isit() {unsigned short num = 1;//0000 000 0000 0001return (1 == *(char *)&num);//接觸原則 }int main04(void) {short num = 1;printf("&num = %p \n", &num);//低位在低字節(jié),高位在高字節(jié)printf("%d \n", isit());//0000 0000 0000 0001//逆序存儲(chǔ):1000 0000 0000 0000//順序顯示:0000 0000 0000 0001system("pause"); }

程序片段(05):顯示整數(shù).c
內(nèi)容概要:位域編程實(shí)戰(zhàn)

#include <stdio.h> #include <stdlib.h>//01.關(guān)于二進(jìn)制位與高低直接之間的關(guān)系: // 1.現(xiàn)代手機(jī),電腦: // 低位在低字節(jié): // 2.Unix服務(wù)器系列: // 低位在高字節(jié): //注:關(guān)于兩種不同存儲(chǔ)方式的優(yōu)缺點(diǎn): // 低位在低字節(jié): // 節(jié)省內(nèi)存 // 低位在高字節(jié): // 快速檢索 //02.調(diào)試顯示狀態(tài): // 低位在低字節(jié)的情況內(nèi)存結(jié)構(gòu)分析: // 1000 0000 0000 0000 0000 0000 0000 0000//逆序存儲(chǔ) // 0000 0000 0000 0000 0000 0000 0000 0001//順序顯示 // 解析特點(diǎn): // 1000 0000:8個(gè)二進(jìn)制位存儲(chǔ)于低字節(jié)位置-->節(jié)省內(nèi)存 //注:逆序存儲(chǔ)-->實(shí)現(xiàn)低位在低字節(jié)-->順序顯示(解析方式) //03.結(jié)構(gòu)體與位域: // 1.位域所涉及的知識(shí): // 結(jié)構(gòu)體+位運(yùn)算 // 2.按照單字節(jié)解析二進(jìn)制位的結(jié)構(gòu)體: // 特殊結(jié)構(gòu)體:位域 //04.位域特點(diǎn)分析: // 1.位域的用處: // (1).內(nèi)存壓縮 // (2).解析數(shù)據(jù)二進(jìn)制位 // 2.內(nèi)存字節(jié)對(duì)齊特點(diǎn): // (1).基于標(biāo)準(zhǔn)結(jié)構(gòu)體法則 // (2).基于內(nèi)存合并法則 // 相同類型,如果位數(shù)相加小于該類型字節(jié)數(shù),則壓縮存儲(chǔ) // 相同類型,如果位數(shù)相加大于該類型字節(jié)數(shù),則填位移字 // (3).特殊位域處理: // 如果位域當(dāng)中的位域?yàn)榭?則空置下一個(gè)此類型字節(jié)數(shù) // 如果位域當(dāng)中的域名沒(méi)有,則空置下一個(gè)此類型字節(jié)數(shù) // 3.快速識(shí)別位域: // 結(jié)構(gòu)體+冒號(hào) // 4.位域組成特點(diǎn)分析: // BitField:位域結(jié)構(gòu)體名(整體) // unsigned char:位域結(jié)構(gòu)體成員類型 // chr:域名 // : :位域結(jié)構(gòu)體標(biāo)識(shí) // 1:位寬 //05.采用位于結(jié)構(gòu)體顯示一個(gè)數(shù)據(jù)的二進(jìn)制存儲(chǔ)形式注意事項(xiàng): // 1.采用指向位域結(jié)構(gòu)體的指針來(lái)存儲(chǔ)變量的地址! // 2.該位于結(jié)構(gòu)體的指針是按照單字節(jié)進(jìn)行內(nèi)存解析的 // 從低字節(jié)開(kāi)始逐個(gè)進(jìn)行解析 // 3.逆序存儲(chǔ)-->順序顯示: // (1).逆序指針:先打印高字節(jié) // (2).逆序域名:反轉(zhuǎn)存儲(chǔ)實(shí)質(zhì) struct BitField {unsigned char chr1 : 1;unsigned char chr2 : 1;unsigned char chr3 : 1;unsigned char chr4 : 1;unsigned char chr5 : 1;unsigned char chr6 : 1;unsigned char chr7 : 1;unsigned char chr8 : 1; };//一個(gè)字節(jié)int main05(void) {printf("sizeof(struct BitField) = %d \n", sizeof(struct BitField));int data = 1;//原始整數(shù)int bitLen = 4;struct BitField * pBitField = &data;//將一個(gè)整數(shù)指針直接賦值給位域結(jié)構(gòu)體變量//pBitField存儲(chǔ)的是位域結(jié)構(gòu)體數(shù)組方式存儲(chǔ)的printf("&data = %p \n", &data);while (bitLen--)//存在-->獲位{//每次解析一個(gè)字節(jié)-->從高字節(jié)開(kāi)始進(jìn)行解析-->一直解析到低字節(jié)printf("%d%d%d%d %d%d%d%d \n",(pBitField + bitLen)->chr8,(pBitField + bitLen)->chr7,(pBitField + bitLen)->chr6,(pBitField + bitLen)->chr5,(pBitField + bitLen)->chr4,(pBitField + bitLen)->chr3,(pBitField + bitLen)->chr2,(pBitField + bitLen)->chr1);}//1000 0000//0000 0000 //0000 0000 //0000 0000 system("pause"); }

程序片段(06):Union.c
內(nèi)容概要:Union

#include <stdio.h> #include <stdlib.h>//01.結(jié)構(gòu)體和共用體的相同點(diǎn): // 1.既不允許空結(jié)構(gòu)體的存在,也不允許空共用體的出現(xiàn): // 也就是說(shuō)結(jié)構(gòu)體或共用體至少必須包含一個(gè)成員 // 2.使用結(jié)構(gòu)體類型或者共用體類型的時(shí)候都必須包含 // struct關(guān)鍵字 union MyUnion01 {int num;double db; };//02.共用體內(nèi)容總結(jié): // 1.共用體的內(nèi)存尺寸等于最長(zhǎng)的那個(gè)成員所占據(jù)的內(nèi)存尺寸 // 最長(zhǎng)成員(包含復(fù)合類型) // 2.共用體的所有成員共享同一數(shù)據(jù)實(shí)質(zhì)(內(nèi)存形式一致) // 但是由于共用體的不同成員類型不一致,因此解析結(jié)果不一致 //注:共用體的各個(gè)成員存儲(chǔ)數(shù)據(jù)存儲(chǔ)實(shí)質(zhì)一樣,但是解析方式卻不一樣 // 區(qū)分存儲(chǔ)實(shí)質(zhì)和解析方式的不同所造成的差異 int main01(void) {//printf("sizeof(union MyUnion01) = %d \n", sizeof(union MyUnion01));//結(jié)構(gòu)體內(nèi)存尺寸等于最寬的那個(gè)成員union MyUnion01 mu01;mu01.num = 3;//mu01.db = 111111111123.98776;printf("%8d, %lf \n", mu01.num, mu01.db);//存儲(chǔ)實(shí)質(zhì)一致,但是解析類型不一致mu01.num = 0;printf("%8d, %lf \n", mu01.num, mu01.db);system("pause"); }

程序片段(07):Union.c
內(nèi)容概要:Union定義方式

#include <stdio.h> #include <stdlib.h>union MyUnion01 {//標(biāo)準(zhǔn)形式int num;float fl; } mu, arr[3], *p;//01.共用體定義方式: // 1.聲明共用體類型的同時(shí)定義共用體變量 // 2.先聲明共用體類型,再定義共用體變量 // 3.標(biāo)準(zhǔn)共用體和匿名共用體 union {//匿名形式int num;float fl; } mu1, arr1[3], *p1;//02.共用體的特點(diǎn): // 1.所有成員共用同一個(gè)數(shù)據(jù) // 2.所有成員公用同一個(gè)地址 // 3.只是由于成員的不同類型,因此導(dǎo)致對(duì) // 同一內(nèi)存地址的同一個(gè)數(shù)據(jù)解析結(jié)果不同 //注:所有變量使用同一地址,所有變量使用同一數(shù)據(jù) // 不同的成員只是決定不同的數(shù)據(jù)解析方式 int main01(void) {//printf("sizeof(mu1) = %d \n", sizeof(mu1));union MyUnion01 mu2, arr2[3], *p2;mu2.num = 100;printf("%d, %f \n", mu2.num, mu2.fl);printf("%p, %p \n", &(mu2.num), &(mu2.fl));system("pause"); }

程序片段(08):對(duì)齊.c
內(nèi)容概要:內(nèi)存對(duì)齊

#include <stdio.h> #include <stdlib.h>struct MyStruct01 {char str[23];short num; };//01.結(jié)構(gòu)體嵌套的情況之下: // 內(nèi)存字節(jié)對(duì)齊數(shù)就是所有基本類型成員當(dāng)中 // 占用內(nèi)存字節(jié)數(shù)最寬的那個(gè)成員 struct MyStruct02 {struct MyStruct01 ms01;char chr; };int main01(void) {//printf("sizeof(struct MyStruct01) = %d \n", sizeof(struct MyStruct01));printf("sizeof(struct MyStruct02) = %d \n", sizeof(struct MyStruct02));system("pause"); }union MyUnion01 {char str[13];int db; };//02.共用體的內(nèi)存尺寸特點(diǎn): // 1.必須遵守內(nèi)存字節(jié)對(duì)齊方式 // 2.為占用內(nèi)存尺寸最大的那個(gè)成員 // 數(shù)組特點(diǎn)+對(duì)齊尺寸 int main02(void) {printf("sizeof(sruct MyUnion01) = %d \n", sizeof(union MyUnion01));system("pause"); }

程序片段(09):01.同與不同.c+02.TypeDef.c
內(nèi)容概要:結(jié)構(gòu)體與共用體的不同

///01.同與不同.c #include <stdio.h> #include <stdlib.h>struct MyStruct01 {int num;double db; };union MyUnion01 {int num;double db; };//01.結(jié)構(gòu)體和共用體各個(gè)成員的特點(diǎn): // 結(jié)構(gòu)體的各個(gè)成員內(nèi)存地址獨(dú)立,數(shù)據(jù)之間沒(méi)有關(guān)系 // 共用體的各個(gè)成員內(nèi)存地址相同,數(shù)據(jù)也是完全相同 //注:共用體的各個(gè)成員由于其數(shù)據(jù)類型的不用,因此對(duì) // 同樣一塊兒內(nèi)存數(shù)據(jù)的解析結(jié)果就不一樣 // (有無(wú)符號(hào)+補(bǔ)碼解析+階碼解析) int main01(void) {struct MyStruct01 ms01, * ps01;union MyUnion01 mu01, *pu01;printf("%p, %p \n", &ms01.num, &ms01.db);//結(jié)構(gòu)體各個(gè)成員內(nèi)存地址不同printf("%p, %p \n", &mu01.num, &mu01.db);//共用體各個(gè)成員內(nèi)存地址相同ps01 = &ms01;pu01 = &mu01;ms01.num;(&ms01)->num;(*&ms01).num;ps01->num;ps01->num;(*ps01).num;mu01.num;(&mu01)->num;(*(&mu01)).num;system("pause"); } ///02.TypeDef.c #include <stdio.h> #include <stdlib.h>//01.typedef的特點(diǎn): // 所有連續(xù)定義的變量名稱都會(huì)成為數(shù)據(jù)類型的別名 typedef struct MyStruct01 {int num;double db; } ms01, ms02;typedef struct MyStruct01 MS;typedef union MyUnion01 {int num;double db; } mu01, mu02;typedef union MyUnion01 MU;typedef unsigned int num1, num2, num3, num4;//num1,num2,num3,num4都是數(shù)據(jù)類型的別名//02.共用體賦值特點(diǎn): // 1.共用體只能對(duì)其中一個(gè)成員進(jìn)行初始化賦值操作 // 2.共用體在經(jīng)過(guò)多次賦值操作之后,其最終結(jié)果是最后一次賦值結(jié)果 //03.結(jié)構(gòu)體和共用體都可以采用指定成員初始化的方式: // 必須是靜態(tài)初始化特點(diǎn)才可以采取指定成員初始化的方式 int main02(void) {MS my01 = { .num = 10, 10.9 };ms01 my02 = { 11, 11.9 };MU myu01 = { 10 };mu01 myu02 = { .db = 11.9 };ms02 my3 = { 12, 129 };system("pause"); }

程序片段(10):PC.c
內(nèi)容概要:共用體

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>struct MyStructX {double db; };union PC {struct MyStructX;int num;char price[10];char * p;} pc01 = { .num = 10000 };struct MyStruct {union PC pc1; };int main01(void) {union PC pc02;pc02.p = (char *)malloc(100);strcpy(pc02.p, "海華裝的電腦,價(jià)格未知!");union PC pc03 = pc02;pc03.p = malloc(100);strcpy(pc03.p, pc02.p);printf("%s, %s \n", pc02.p, pc03.p);free(pc02.p);printf("%s, %s \n", pc02.p, pc03.p);system("pause"); }//01.針對(duì)于結(jié)構(gòu)體和共用體而言: // 1.都存在著淺拷貝和深拷貝問(wèn)題 // 2.變量名稱可以和結(jié)構(gòu)體的名稱相同 int main02(void) {union PC pc = { 10000 };union PC arr[3] = { {10000},{10000}, {10000} };union PC * p = (union PC []){ {10000},{10000},{10000} };//++pc;//arr = arr;pc.num++;++pc.num;printf("%d \n", pc.num);system("pause"); }//02.采用共用體可以采用多種方式描述同一個(gè)事物: // 注:共用體當(dāng)中所存儲(chǔ)的成員一旦改變,就只能訪問(wèn)最后一個(gè)數(shù)據(jù) // 同一個(gè)地址,同一個(gè)數(shù)據(jù)(指針變量和普通變量存儲(chǔ)的內(nèi)容一致) int main03(void) {union PC pc;pc.p = (char *)malloc(100);strcpy(pc.p, "海華裝的電腦,價(jià)格位置!");pc.num = 4000;printf("%s \n", pc.p);free(pc.p);//嚴(yán)重錯(cuò)誤system("pause"); }

程序片段(11):Data.c
內(nèi)容概要:數(shù)據(jù)管理編程

#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include <string.h>//01.如何"多行表示"一個(gè)"整體存儲(chǔ)"的字符串? // 采用反斜杠"\"操作符作為多行表示字符串的結(jié)尾鏈接狀態(tài) char str[1024] = "521276402----hanlei@19940403 \286738260----WEIPEI559720 \501223616----feng66532008 \851400824----shuidongwo520 \1340382355----huang.512yang \1061817115----fz62wangyong1983 \347232860----20080811 \1028181591----7404850554 \120539543----0.0123456789 \754229005----460228214 \819781633----zmt1993826 \1319148052----YNU1500621032 \904972448----zhouxiaowen.520 \750134133----1292857988 \438905700----320675 \379644978----7758521tao \346083956----devl1017 \562193724----5361a749 \286124126----xuqiang1988 \4008167599----234567 \937350113----MAWENcxn1020 \873589635----qqco1341HUA \853249795----5385939d ";//02.創(chuàng)建類型為struct info的結(jié)構(gòu)體類型 // 1.用于描述單個(gè)用戶的信息實(shí)體 // 2.單個(gè)結(jié)構(gòu)體對(duì)應(yīng)于一個(gè)用戶的信息 struct info {long long QQ;char pass[16]; };//03.采用結(jié)構(gòu)體描述動(dòng)態(tài)結(jié)構(gòu)體數(shù)組: // 用戶結(jié)構(gòu)體動(dòng)態(tài)數(shù)組用于描述多個(gè)用戶信息實(shí)體 //注:基于C語(yǔ)言的所有數(shù)據(jù)結(jié)構(gòu)都依賴于結(jié)構(gòu)體 struct infos {struct info * pInfo;int len; } myInfos;int getRowNum(char * pStr) {//根據(jù)每行字符串所共有的特征進(jìn)行數(shù)據(jù)行的統(tǒng)計(jì)int rows = 0;for (char * pTemp = strstr(pStr, "----"); NULL != pTemp; pTemp = strstr(pTemp + 4, "----")){//兩面夾擊統(tǒng)計(jì)法++rows;}return rows; }void initMem() {//采用結(jié)構(gòu)體模擬動(dòng)態(tài)結(jié)構(gòu)體數(shù)組int len = getRowNum(str);myInfos.pInfo = (struct info *)malloc(len * sizeof(struct info));myInfos.len = len; }void initData(char * pStr) {int len = strlen(pStr);for (char * p = pStr; p < pStr + len; ++p){//針對(duì)于原始數(shù)據(jù)的預(yù)處理操作if (' ' == *p){*p = '\0';}}for (char * p = pStr, chr = 0; p < pStr + len; ++p){//根據(jù)字符串?dāng)?shù)據(jù)進(jìn)行結(jié)構(gòu)體數(shù)據(jù)拼裝//printf("%p, %d \n", p, chr);char * pTmp = (char *)calloc(strlen(p) + 1, sizeof(char));strcpy(pTmp, p);//"521276402\0---hanlei@19940403"//pTmp-->pWei+4char * pWei = strstr(pTmp, "----");*pWei = '\0';sscanf(pTmp, "%lld", &(*(myInfos.pInfo + chr)).QQ);sprintf((*(myInfos.pInfo + chr)).pass, "%s", pWei + strlen("----"));p += strlen(p) + 1;} }void showAllData() {for (int i = 0; i < myInfos.len; ++i){printf("QQ = %lld, pass = %s \n", (*(myInfos.pInfo + i)).QQ, (*(myInfos.pInfo + i)).pass);} }void showDataStatus() {printf("還有%d條數(shù)據(jù)! \n", myInfos.len); }void help() {printf("1.顯示數(shù)據(jù) \n");printf("2.刪除數(shù)據(jù) \n");printf("3.插入數(shù)據(jù) \n");printf("4.修改數(shù)據(jù) \n");printf("5.查找數(shù)據(jù) \n");printf("6.顯示全部數(shù)據(jù) \n");printf("7.對(duì)于QQ排序 \n");printf("8.清屏 \n");printf("9.Helop \n");printf("\n"); }void deleteData(){}int main01(void) {initMem();initData(str);help();while (1){char chr = getch();//實(shí)時(shí)獲取單個(gè)字符//char chr = '\0';//getchar(chr);//putchar(chr);switch (chr){case '1':showDataStatus();break;case '2':break;case '3':break;case '4':break;case '5':break;case '6':break;case '7':break;case '8':system("cls");break;case '9':help();break;default:break;}}system("pause"); }

轉(zhuǎn)載于:https://www.cnblogs.com/niulanshan/p/6174595.html

總結(jié)

以上是生活随笔為你收集整理的20160221.CCPP体系详解(0031天)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。