下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、1.基本類型1.1變量的分類以為劃分依據(jù),分為全局變量與局部變量。例外:函數(shù)參數(shù)也是局部變量1.2變量的作用域作用域的最大單位是文件(編譯的最小單位是文件),作用域的最小單位是 ,全局變量的作用域的文件,局部變量的作用域是,變量的作用域,始于定 義處,結(jié)束預(yù)作用域結(jié)束。相同的作用域內(nèi)不可以有重名的變量。當(dāng)局部變量發(fā)生重名的時候,局部會覆蓋全局的變量,小范圍與大范圍的變 量發(fā)生重名的時候,小范圍會覆蓋大范圍的變量 。1.3變量的生命周期局部變量的生命周期早所在的函數(shù),全局變量的聲明周期同main()。1.4修飾類型修飾類型影響了變量的生命周期和存儲區(qū)域。1.4.1auto 自動變量局部變量在缺省
2、存儲類型的情況下歸為自動變量作用:修飾局部變量存儲區(qū)域:棧生命周期:同所在的函數(shù)或作用域特點(diǎn):如未初始化,初始值未知。大將軍變量,隨用隨開,用完即消1.4.2register 寄存器變量存放在CPU的寄存器中。對于循環(huán)次數(shù)較多的循環(huán)控制變量及循環(huán)體內(nèi)反 復(fù)使用的變量均可定義為寄存器變量。作用:修飾局部變量 影響了變量的存儲區(qū)域存儲區(qū)域:寄存器生命周期:同所在的函數(shù)或作用域,隨用隨開,用完即消。特點(diǎn):如未初始化,初始值未知。不可取地址,易被編繹器優(yōu)化1.4.3static 靜態(tài)變量在程序執(zhí)行時存在,并且只要整個程序在運(yùn)行,就可以繼續(xù)訪問該變量。作用:修飾局部變量和全局變量存儲區(qū)域:數(shù)據(jù)區(qū)生命周期
3、:同main()特點(diǎn):只初始化一次,默認(rèn)初始化為0,生命周期同main();影響了全局 變量的作用域和局部變量生命周期。1.4.4extern 擴(kuò)展類型擴(kuò)展全局的作用域。同文件中,或不同文件中。作用:修飾全局變量。存儲區(qū)域:數(shù)據(jù)區(qū)生命周期:同main()特點(diǎn):因為是修飾的是全局變量,所以只擴(kuò)展了其作用域(本文件內(nèi)或跨文 件)。1.5c中const的類型1. const定義常量從匯編的角度來看,只是給出了對應(yīng)的內(nèi)存地址,而不是 象#define 樣給出的是立即數(shù),所以,const定義的常量在程序運(yùn)行過程中只 有一份拷貝,而#define定義的常量在內(nèi)存中有若干個拷貝。2. 提高了效率。編譯器通常
4、不為普通const常量分配存儲空間,而是將它 們保存在符號表中,這使得它成為一個編譯期間的常量,沒有了存儲與讀內(nèi)存的 操作,使得它的效率也很高。1.6總結(jié)變量類型修飾類型作用域生命周期進(jìn)程空間無本文件或其他文件同 main讀寫數(shù)據(jù)區(qū)rwstatic本文件讀寫數(shù)據(jù)區(qū)rw局部register定義變量所在的同所在的函 數(shù)寄存器auto定義變量所在的棧static定義變量所在的 ,但可被引用同 main讀寫數(shù)據(jù)區(qū)rw2.進(jìn)程空間與內(nèi)存管理2.1程序和進(jìn)程程序:源代碼經(jīng)過編譯器編譯后生成的可執(zhí)行文件,靜態(tài)的概念進(jìn)程:可執(zhí)行文件,運(yùn)行后被加載在內(nèi)存中運(yùn)行,運(yùn)行的過程,即為進(jìn)程。 以下是可執(zhí)行文件加載到內(nèi)存
5、后的分布情況,動態(tài)的概念。2.2進(jìn)程空間布局首先32為操作系統(tǒng)采用虛擬內(nèi)存技術(shù),將4G的虛擬地址空間劃分為兩個部 分:用戶空間和內(nèi)核空間。用戶空間從 0到Oxbfffffff, 內(nèi)核空間從3G到4G 用戶進(jìn)程不能訪問內(nèi)核。程序中訪問的內(nèi)存地址不再是實際的物理內(nèi)存地址,而是一個虛擬地址,然后由操作系統(tǒng)將這個虛擬地址映射到適當(dāng)?shù)奈锢韮?nèi)存地址上。這樣,只要操作 系統(tǒng)處理好虛擬 地址到物理內(nèi)存地址的映射,就可以保證不同的程序最終訪問 的內(nèi)存地址位于不同的區(qū) 域,彼此沒有重疊,就可以達(dá)到內(nèi)存地址空間隔離的 效果。物理內(nèi)存虛擬內(nèi)存BIZ1 、A/I進(jìn)程空間分布如下圖:數(shù)據(jù)量分布進(jìn)程空間注釋comma nd
6、 args命令行參數(shù)普通局部變量stack棧dyn amic lib加載動態(tài)庫區(qū)malloc動態(tài)申請空間heap堆datauninitbss未初始數(shù)據(jù)段普通全局未初始化靜態(tài)(全局或局初始化部)initrw初始化數(shù)據(jù)段的讀寫段常量常量r0初始化數(shù)據(jù)段的只讀段常量注:text代碼段上面常量是包括初始化的ro只讀段2.3內(nèi)存管理2.3.1棧內(nèi)存棧區(qū)(stack )有編譯器自動分配釋放,存放函數(shù)的參數(shù),局部變量等windows中,棧是向低地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是一塊連續(xù)的內(nèi)存區(qū)域。也就是棧 頂?shù)牡刂泛蜅5淖畲笕萘?windows是2M是系統(tǒng)規(guī)定好的。如果申請的空間超 過剩余??臻g,將提示overflow
7、,因此從棧獲得的空間較小。??臻g不能返回。2.3.2堆內(nèi)存堆區(qū)(heap)一般由程序員分配和釋放,否則就由OS回收。堆用于存放全局變量,靜態(tài)變量,常量字符串和函數(shù)代碼(函數(shù)體的二進(jìn)制代碼). 堆:堆是向高地址擴(kuò)展的數(shù)據(jù)結(jié)構(gòu),是不連續(xù)的內(nèi)存區(qū)域。堆的大小受限于系統(tǒng)中有效的 虛擬內(nèi)存。由此可見堆的內(nèi)存獲得比較靈活,空間較大。另外對內(nèi)存可以在函數(shù)中返回。堆內(nèi)存的申請與釋放malloc:void *malloc(size_t,Size),malloc函數(shù)在堆中分配參數(shù)_Size指定大小的內(nèi)存,單位:字節(jié),函數(shù)返回void*指針。calloc:void*calloc(size_t nm emb,size
8、_tsize);第一個參數(shù)是所需內(nèi)存單元數(shù)量,第二個參數(shù)是每個內(nèi)存單元的大小(單位:字節(jié)),calloc自動將分配的內(nèi)存置0reallocvoid*realloc(void*ptr,size_t size);第一個參數(shù) p 為之前用 malloc或者calloc 分配的內(nèi)存地址,_NewSize為重新分配內(nèi)存 的大小,單位:字節(jié)。 成功返回新分配的堆內(nèi)存地址,失敗返回 NULL.如果參數(shù)p等于NULL,那么 realloc 與malloc 功能一致realloc 新分配的空間不會像 calloc 自動清 空,而是像malloc 樣需要手動清空freevoidfree(void *p); fre
9、e 負(fù)責(zé)在堆中釋放 malloc 分配的內(nèi)存。參數(shù)p為 malloc返回的堆中的內(nèi)存地址堆內(nèi)存的常見錯誤釋放以后繼續(xù)使用是錯誤的通過函數(shù)返回堆里的內(nèi)存常見錯誤:棧上的空間不能返回,只讀數(shù)據(jù)區(qū)數(shù)據(jù)不能修改。在返回值的時候要具體情況具體對待,要清楚返回的指針是在常量區(qū)還是在棧區(qū)等。并且 如果指針作為參數(shù)的時候是傳入本身還是能夠修改值。1. 通過返回值返回2.通過參數(shù)返回intmai nO1()void (*p)()= func; /定義一個函數(shù)指針,指向func的地址int *p1 = (int *)p; /把指向代碼區(qū)的指針強(qiáng)轉(zhuǎn)為int *p1 = 10;/改變代碼區(qū)的內(nèi)容是非法的。 retur
10、n 0;int a1()printf( "a1n");return 5;int a2()printf( "a2n");return 6;/ 函數(shù)返回一個指針 /int *get1() /這個是個錯誤的模型int a = 10;return&a;/代碼的問題時,返回一個棧變量的地址int *get2() /正確的模型static int a = 10;return &a;/因為a是一個靜態(tài)變量,靜態(tài)變量的地址在程序運(yùn)行期間 一直有效int *get3() /正確的模型return calloc( 1, sizeof (int ); / 返回
11、了一個堆的地址const char p = calloc( 10, 1);get_str1() / 錯誤的模型char s 6 = "hello" ;/s 在哪里?在棧里 return s; /返回一個棧的地址const char *get_str2() / 正確的模型 _return "hello" ; /hello是一個常量,在常量區(qū),常量區(qū)和靜態(tài)區(qū)是一樣的,唯一的區(qū)別是常量區(qū)是只讀的const char *get_str3() / 正確的模型const char *s = "hello"return s;const char *
12、get_str4() / 正確的模型 _char *p = calloc( 10, 1); / 堆空間strcpy(p, "hello"); return p;/函數(shù)的參數(shù)是指針void get_str5( char *p) / 正確的模型strcpy(p, "hello");void get_str6( char *p) / 錯誤的模型 _p = calloc( 10, 1); /這個地方是給p這個形參分配了內(nèi)存,但并沒有 修改實參的值strcpy(p, "hello");/函數(shù)終止的時候,p已經(jīng)消失了void get_str7(
13、char *p) / 合法的 _strcpy(*p, "hello");void get_str8( char *p) / 錯誤的模型 _*p = calloc( 10, 1);strcpy(p, "hello" ); /p是一個二級指針,不能當(dāng)字符串處理 3.結(jié)構(gòu)體struct是結(jié)構(gòu)體的關(guān)鍵字3.1匿名結(jié)構(gòu)體僅在本地使用,不能帶來多余的類型名。但需要定義的時候同時定義變量structchar n ame30;char sex;int age;float high;stu;3.2有名結(jié)構(gòu)體一處定義,可以多出使用。struct stude ntchar n
14、 ame30;char sex;int age;float high;stu;struct stude nt stu2;3.3別名結(jié)構(gòu)體更好使用的結(jié)構(gòu)體typedef struct stude ntchar n ame30;char sex;int age;float high;STUDENT;STUDENT stu, stu2;3.4結(jié)構(gòu)體類型變量的初始化以及訪問3.4.1初始化凡是構(gòu)造類型,要么在定義的時候初始化,要么先定義再成員分別初始化3.4.2訪問方式訪問訪問方式有兩種一類是(.)成員運(yùn)算符,一類是(->)指向運(yùn)算符。3.4.3賦值同類結(jié)構(gòu)體間可以相互賦值。struct Arr
15、ay int val 10;int mai n()struct Array array = 1, 2, 3, 4, 5, 6 ;struct Array array2 = array;for (int i =0; i <10; i+)printf( "%dn" ,array2. val i);return 0;3.5結(jié)構(gòu)體數(shù)組舉例:structPers onchar nam 30;int voteCo unt;;int mai n()structPers on man3 = "zhangsan" , 0 , "lisi" , 0
16、 , "wangwu", 0 ;printf( "t-can didateas follow-n");for (int i =0; i <3; i+)printf( " |%s", mani. name;putchar( 10);char namebuf30;for (int i =0; i <10; i+)printf( "pls in put your pers on:");scanf( "%s", namebuf);for (int i = 0; i < 3; i+)if
17、 (strcmp( namebuf,ma ni.n ame = 0)mani. voteCount +;for (int i =0; i <3; i+)printf( " |%s -vote count: %dn", mani. name mani. voteCount);return 0;3.6結(jié)構(gòu)體中嵌套結(jié)構(gòu)體struct stude ntchar nam 30; char sex;int age;float high ; struct birthday int year; int month; int day;; int birth ;mai n()struct
18、 student stu = "wang", 's' , 23, 175.0, 1988, 8, 18 ; printf( "name %s birthday year = %d: stu. name stu. birth . year); return 0;3.7結(jié)構(gòu)體作為函數(shù)參數(shù)和返回值struct complexfloat real ;float imag;struct complex addComplex(struct complex com1, struct complex com2) struct complex res;res. re
19、al = com1.real + com2.real ;res. imag = com1.imag + com2.imag;return res;int mai n()struct complex com1 = 1.2f , 2.3f ;struct complex com2 = 2.3f , 2.4f ;struct complex res = addComplex(com1, com2);printf( "res real = %f ,imag = %fn" , res. real , res. imag); return 0;3.8結(jié)構(gòu)體的大小以及內(nèi)存對齊方式3.8.
20、1成員內(nèi)存分布首成員在低地址,尾成員在高地址struct Stuchar sex;int age;;int mai n()struct Stu stu;printf( "struct stu = %dn", sizeof (struct Stu);printf( "&stu = %pn", &stu);printf( "&stu.sex = %pn", &stu. sex);printf( "&stu.age = %pn", &stu. age); return 0;
21、3.8.2對齊原則x86(linux 默認(rèn)#pragmapack(4),window 默認(rèn)#pragma pack(8)。nux 最大支持4字節(jié)對齊。方法:1. 取pack(n)的值(n= 1 2 4 8-),取結(jié)構(gòu)體中類型最大值 m。兩者取小即為外對齊大小 k= (m<n:m,n)。2. 將每一個結(jié)構(gòu)體的成員大小與k比較與小者,為x內(nèi)對齊大小.3. 所謂按x對齊,即為地址(設(shè)起始地址為0)能被x整除的地方開始存放數(shù)據(jù)。4. 外部對齊原則是依據(jù)k()的值,進(jìn)行補(bǔ)空操作。#i nclude <stdio.h>#pragma pack(4)struct stuchar a;sho
22、rt b;int c;char d;int mai n()printf( "%dn", sizeof (struct stu);return 0;4擻組4.1 一維數(shù)組4.1.1數(shù)組的本質(zhì)是一種構(gòu)造類型,內(nèi)存是一段連續(xù)的存儲區(qū)域。數(shù)組類型中包括起始地址,步長,尋址范圍。決定了內(nèi)存的訪問方式。4.1.2初始化int array10 = 1,2,3; /部分初始化int array210 = 3 = 10;int array110 = 0; /清零int array310 = 1,2,3,4,5,6,7,8,9,0,1,2;越界不檢4.1.3步長int a10=0;/i nt1
23、0 a;printf("a = %pn",a); printf("a+1 = %pn",a+1);移動 4 個字節(jié)printf("&a = %pn",&a); printf("&a+1= %pn",&a+1); 移動 40 個字節(jié),注:對于一維數(shù)組取地址,等價于數(shù)組指針而不是二級指針。int a10;int (*p)10=&array;4.1.4作為參數(shù)傳遞void select£ort(int *pjint n)<int tmp; forfint i=fl;
24、i+)for(int j-i+1; j<nj j+)<if(pi>pj)( tmp = pi; Pl = Pfj; pj = tmPjint mainO<int array19 = 9,87,6,5,4,3,2,1,0; selectSort(array,19);forfint i=fl; i<10 ;i+)< printf("%dn 'arrayti;return 3;4.1.5返回堆里的數(shù)組通過返回值chai * getMem(nit n);char * getf4eihirtt n)char *p - (char*>ralloc
25、(h)ireturn *p;注:這里要與data段的ro段分開,若為char *p="dewufy",則不能被返回通過函數(shù)參數(shù)vcad getMemfchar “檢 int n);int getem(char *rpf int n)(*p = (char*)naUoc (n);if(*p = NULL)return *1; tl隊一牛子希審申的需H牛字將.void del_str(ciar "str衛(wèi)it nJ;注:此題在定義數(shù)組時要將0 '的字節(jié)分配進(jìn)去,循環(huán)移位時要循環(huán)本身 的長度,否則會發(fā)生未知錯誤4.2二維數(shù)組4.2.1數(shù)組的本質(zhì)是一個一維數(shù)組,只
26、是數(shù)組成員,由基本數(shù)據(jù)類型變成了構(gòu)造數(shù)據(jù)類型。Type nameMN=typeN nameM4.2.2初始化行可以省,列不可以省部分初始化和清零任然可以用int a23=12=3;4.2.3訪問int a34 /in t4 a3/i nt43 a1.a為首數(shù)組的地址,a+1跳躍4*4位2.&a為整個數(shù)組的地址,&a+1跳躍4*3*4位3. *a,a0,*(a+0)樣,加 1 都跳躍 4 位4. *(a+i)+j,為第i行第j個元素的地址/這里的*號要理解為derefrenee,解引用變成一個int *5. *(*(a+i)+j)為第i行第j個元素的值int wiain()<
27、;int flrrvyfB4 - l,2j7,% % 11 j21J/int4 array?;printf("array = SpXfi'Brray);printf("array*1 = KpXn'array+l;printfCarrayEO = %pn"Jarray0);printf(,array0+l = Xpn,r3 array 0+l);printf (-iarrayB e= 5Spn"&array& aj j / int4) ae ai azprintf(B&array90 +1 - XpMi"
28、,Sarray0 0+l);"53宅 array array00 -> *("(array+0)+«J "S吒 array -> arrayi j *(*(array+i)+j) print'F(uarray+l = nT, ,array +1); print'F("arra/+l +1 - 56pnh,array +1 +1;printf ("* (array+1) +1 = S4>Xn">* (array +1) +l)j/解引月類出于一維數(shù)遲引巨后.解引用的結(jié)臭prirrtf(
29、array 1 printf("arraylSpXn",arrayl)j %pn* orroyCl -t-1);return 0;具體圖示int aPHt intffl 斕;int 4 A,in( a04t個 1 +2)int aJtint4 al;424作為參數(shù)傳遞為了轄決二養(yǎng)誥組訖僵引入了數(shù)走指void displa(yArray(ifrt:(*p)4jinrt n) for(int i=0; i<n; i+)for(int j=0; j<4; j+) putchar(19);int main()int array|34 = 1,2.3,4,2.3,4.5,
30、3,4,5.61; displayArray(arrayj 3);return 6;424二維到一維的存儲以及一維數(shù)組二維的訪問tinclude <stdio.h>int mainC)(int array23J = (9,8,7,6,5,4); forfint i=0;i<2; 1+)<For(int j=0;j<3;j+)<printf("lM 'errayCi j); putchar(10);int *p = (int *)array; for(int i=& i<6;i+) printf("Kd -,pi;re
31、turn 8;注:二維到一維的存儲int main()<int srray12=卩以無45,®了'卩巧。門122;int (*p)4 = (int(*)4)array;for(int i0; sizeofCarrayJ/sizeof(int4); i+)for(int j<4; j+)printft-XW.pMtjDiputchar(10);return 9;注:一維數(shù)組二維訪問4.3數(shù)組指針4.3.1聲明int (*pName)N;4.3.2應(yīng)用一維數(shù)組二維訪問傳遞二維數(shù)組的時候,作參數(shù)練習(xí):int a55;int (*p) 4;p - a;問 如42-血可口的
32、值為務(wù)少?注:此題要理解&這里是解引用為int *型的,相加減的時候為指針的差,并不是地址的差值。答案為-4#inciude <stdio,h>int main()int a5 -irt *ptr = (int*)(&a + 1);prir)tf("%d*(a+l)J*(ptr-l);return 0;注:a取地址之后變?yōu)閿?shù)組指針,加1后指向外面,又被int * 轉(zhuǎn)換為指針類型則ptr-1回指一個int,為5,而*(a+1)為2.5.指針5.1指針的本質(zhì)5.1.1&取地址運(yùn)算符(refrence)/可以理解為解引用為int *類型指針類型決定了從指
33、針變量存放的地址處的尋址能力,包括地址,步長5.1.2指針變量type * p /type決定步長,*表示指針,p為一個變量5.1.3步長一級指針中,類型決定了步長二級以上指針,步長都是4個字節(jié)5.1.4 *求內(nèi)容運(yùn)算符(derefrence)注:聲明指針變量的*和取內(nèi)容的*是不一樣的,這也是一種規(guī)定5.1.5指針運(yùn)算、同類指針相加減,得到的結(jié)果是步長數(shù),而不是字節(jié)數(shù)5.2二級指針5.2.1聲明NULLchar *p;若要與char *pN相等價,則后者最后含有5.2.2用法傳一級指針,改變指針指向的內(nèi)容。傳二級指針,改變一級指針指向的內(nèi)容。include <stdio.h> in
34、t m = SCO; void func(int *p)*P 二 400;void func2(int *'pp) (*pp > &m;int n)ain(int a = 1&0j func(&a); printf("a = Xdn"fa)|int *p -func2(lp);print= Wn*f*p)5 5.3指針數(shù)組5.3.1本質(zhì)char *pArrayN,pArray 先與結(jié)合,char *修飾的數(shù)組的內(nèi)容,即數(shù)組的每個元素指針數(shù)組的本質(zhì)是數(shù)組,數(shù)組中的每一個成員是一個指針。取值和取址其實 都是取址。5.3.2訪問方式為二維數(shù)組
35、的訪問方式5.3.3二級指針訪問指針數(shù)組二級指針與指針數(shù)組名等價的原因char *p是二級指針,char* arrayN;array = &array0; array0本身是 char* 型訪問方式:指針方式 指針訪問方式,比數(shù)組訪問方式少了一個維度的概念, 所以,通過指針方式訪問,要么知道維度,要么知道結(jié)束標(biāo)志。在這里可以用二 維數(shù)組的那套公式去做具體值的訪問。char * pArray = "apple11 j pear", "banana*f.l,oranee-J pineApple*!; char *pA - pArray;for(inti<
36、5 ;i+)< printf("%snt',*pA+);宴么需姿站東標(biāo)老include <stdio,h>int main(int argc j char 土 argv)char * pArray二appLe","pear_J"banana"j-range-', "pineAppiejNULLjj char *pA = pArray;while(*pA)<printf ("Snsri, *pA+);return 0;534 const與指針const char *p=34;*p不能修改
37、值,而p本身可以改變int *const p=34;*p可以改變值,而p本身不能改變const char *constp=34;都不能改變5.3.5常用指針數(shù)組int main(intargc,char *argv)或者 int main(int argc,char*argv)int main( char argv,char *argc,char *e nv)int main(int argc ,char * argv±char *env)for(int i-S; i<argc; 1+)(printf(MfcnM,argvi)jwhile(*argv)<printf(j
38、*argv+);.while(*env)<printf(*'%snH>*env+);return 6*注:這里面有一個缺點(diǎn)就是,參數(shù)的指針移到了別的地方,需要指定另一個指針去操作,這樣不會改變指針指向的地方5.4返回堆上一維空間5.4.1 級指針作為返回值輸出void * allocMem( int base, int count)void *p = malloc(base *count); return p; return p;int mai n()char *p = allocMem(sizeof (char), 100); strcpy(p, "china&
39、quot; ); printf( "%s",p); free(p); return 0;5.4.2二級指針作為函數(shù)參數(shù)輸出int allocMem(void *p, int base, int n) *p = malloc(base* n);if (*p = NULL) return -1;int mai n()char *p = NULL;allocMem(&p, sizeof (char), 100); strcpy(p, "china");printf( "%s",p);free(p);return 0;5.5返回堆上二
40、維空間二維空間,并不一定就是二維數(shù)組,具有數(shù)組的訪問形式。但己經(jīng)遠(yuǎn)遠(yuǎn)不是 數(shù)組的定義了5.5.1 級指針作返回值輸出void * alloc2DMem(int base, int row, int line)void *p = malloc(base*row*line);return p; int mai n()int (*p) 5 = alloc2DMem(sizeof (int ), 3,5);for (int i= 0; i< 3; i+)for (int j= 0; j< 5; j+)pij= i+j;for (int i= 0; i< 3; i+)for (int
41、j= 0; j< 5; j+)printf( "%d " ,*(*(p+i)+j);putchar( 10); free(p);return 0;5.5.2二級指針作返回值輸出內(nèi)存不連續(xù)void *calloc( int base, int row, int line) void *p=malloc(row* sizeof (char *); int i= 0;for (i= 0;i<row;i+)pi=malloc(base*li ne);return p;內(nèi)存連續(xù)的void *calloc( int base, int row, int line)void
42、*p=malloc(row* sizeof (char *);char (*a)row*line=( char / 這里定義 void *也可以(*)row*li ne)malloc(base*row*li ne);這里分配空間用數(shù)組指針,需要多加注意,因為這里都是值了,用指針數(shù)組的話又是一個二級指針了int i= 0;for (i= 0;i<row;i+)pi=a+; /這里單純的是賦給空間return p;如何釋放通過函數(shù)參數(shù),二級指針傳地址釋放如果申請的一段連續(xù)的空間,那么釋放的時候只能釋放兩次,分別為 p0和p而不能釋放幾次了void freecalloc( int *p, in
43、t n) 這里的 n 為行數(shù)int i= 0;for (i= 0;i<n;i+)free(pi);free(p);5.5.3三級指針作為函數(shù)參數(shù)輸出void allocMem(void *p, int row, int line)*p=malloc(row* sizeof (void *); *p 就為二級指針了 for (int i= 0;i<row;i+)(*p)i=malloc(base*line);*p 要打括號,作為一個整體,相當(dāng)于void *p中的p返回二維空間總結(jié):二級指針和二維數(shù)組名,沒有關(guān)系。不代表二級指針,同二維空間沒有關(guān)系cha r *p 3char* p26
44、.函數(shù)指針6.1本質(zhì)指向一段代碼段的首地址6.2回調(diào)函數(shù)回調(diào)函數(shù)經(jīng)常用在菜單里面,通過不同的點(diǎn)擊達(dá)到不同的效果6.3函數(shù)指針數(shù)組定義:一個返值和參數(shù)皆為void函數(shù)指針數(shù)組void (*fu ncArrayN)(void);題:(*(void (*)()0)(),0被轉(zhuǎn)化為函數(shù)指針類型,然后解引用為一個無參數(shù)的函數(shù)調(diào)用。練習(xí):1、判斷一個機(jī)算機(jī)系統(tǒng)的大小段對齊(兩 種方法)void bigOrsmall()int data = 0x1234567&char *p = (char*)&data;if (*p = 0x78)printf( "small endiann&q
45、uot;);elseprintf( "bigendiann");void bigOrsmall2()union unint a; char b;union un u;u.a = 0x12345678if (u. b = 0x78)printf( "small endiann");elseprintf( "big endiann");int main( void )char a; short b; int c; double d; float e;/&取變量空間中低位字節(jié)的地址,指針的大小4個字節(jié)char * p = &
46、a;bigOrsmall2();*( int *) 0x12345678 = 1234;char *p = NULL; char *p; p = NULL;*p = NULL; return 0;注意:int a=0x12345678小端對齊大端對齊1278345656347812咼位在咼地址咼位在低地址2.序列加密char* code(char * buf, int line) int len = strle n( buf);int n le n = len;if (len%line!= 0)nlen = len + (line - len%line); char *pt = calloc(
47、nlen+ 1,1); strcpy(pt,buf);for (int i=len ; ivnlen; i+)pti = '*'char * secret = calloc(nlen+ 1, 1); char *ps = secret;char (*pa)li ne = (char (*)li ne)pt; for (int i= 0; i<line;i+)for (int j= 0;jvnlen/line; j+)*ps+ = paji;*ps = '0' free(pt);return secret;char* decode(char * buf, i
48、nt line)int len = strle n( buf); line = len /line;char * desecret = calloc(len+ 1,1); char *pd = desecret;char (*pt)li ne = (char (*)li ne)buf; for (int i= 0; i<line;i+)for (int j= 0; j<len/line;j+)*pd+ = ptji;*pd = '0' while (*-pd= '*')*pd = '0' retur n desecret;int ma
49、in( void )char * buf = "my name is techwang" char *secret = code(buf, 7);printf( "secret = %sn ",secret);char * dese = decode(secret, 7);printf( "dese = %sn ",dese);free(secret);free(dese);return 0;注意:fgets會得到0 strcpy 也會同時拷貝0 , FILE *p p指向的是FILE這個結(jié)構(gòu)體中的內(nèi)容3.求大小#i nclude &
50、lt;stdio.h>void func( int b 100)printf( "%dn", sizeof (b); 4int main( void )int *p= NULLprintf("%dn",sizeof(p);4printf("%dn",sizeof(*p);4int a100;printf("%dn",sizeof(a);/400printf( "%dn", sizeof (a 100);4printf( "%dn", sizeof (&a 0);
51、 4 int b100;fun c(b);int c2 3;printf( "%dn", sizeof (c);24printf( "%dn", sizeof (c 0);12 /int3c2int (*d) 3; printf( "%dn", sizeof (d); 4 char *q = malloc( 100);printf( "%dn", sizeof (q); 4printf( "%dn", sizeof (&a); 4 /window vs linux return 0;7.
52、鏈表7.1鏈表引入的意義鏈表是對內(nèi)存中零碎空間的有效組織和使用。數(shù)組的特點(diǎn):存儲:內(nèi)存中的一段連續(xù)的存儲空間。2M-10Mmalloc對數(shù)大空間,容易申請缺點(diǎn):時間復(fù)雜度為0(1),插入和是刪除,支持力度很差 鏈表的特點(diǎn):是對零碎空內(nèi)存中不連續(xù)的點(diǎn)空間,構(gòu)成邏輯上的連續(xù)空間申請空間很長, 間的有效組織。插入和刪除是很方便的缺點(diǎn):時間復(fù)雜度為0(n)。7.2單向鏈表7.3雙向循環(huán)鏈表7.3.1雙向鏈表的節(jié)點(diǎn)typedef struct nodeint data;struct node *pre; struct node *next; Node;7.3.2雙向鏈表的結(jié)構(gòu)head頭指針next7.3
53、.2雙向鏈表的創(chuàng)建靜態(tài)創(chuàng)建Node a;Node b;Node c;Node d;Node * head = &a;a是頭節(jié)點(diǎn)沒有內(nèi)容a. data=Oxfffff ; /設(shè)節(jié)點(diǎn)a為頭節(jié)點(diǎn),b. data=1;c. data=2;d. data=3;a. n ext = &b;b. n ext = &c;c. n ext = &d;d. n ext = &a;a. pre = &d;d.pre = &c;c.pre = &b;b. pre = &a;Node *phead = head->next;while (ph
54、ead != head) /只要不回到頭結(jié)點(diǎn)就循環(huán) printf( "%dn" ,phead->data);phead = phead->n ext;動態(tài)創(chuàng)建1. 尾插法head分析:首先要循環(huán),所以要定一個Node*ph,跟著一起移動,同時也防止head的位置移動。不管單鏈表還是雙向鏈表都需要步驟:Node *ph二head;cur->pre=ph;ph->n ext二cur;pre二cur;代碼:Node *createList()Node *head=(Node *)malloc( sizeof (Node);Node *ph=head;Node *cur=NULL;ph->next=NULL;將ph的前驅(qū)和后驅(qū)都置為空 ph->pre=NULL;int data;scanf( “%d,&data);while (data)cur=(Node *)malloc( sizeof (Node); cur->data=data;
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 財務(wù)廉潔從業(yè)工作心得總結(jié)
- 黨員教師學(xué)年自我總結(jié)
- 個人貨車包月合同模板
- 工程貨車出租合同模板
- 《感受大自然之美》課件
- 變賣委托合同范例
- 與業(yè)主物業(yè)交割合同模板
- 小區(qū)普通房源出租合同模板
- 工控合同模板
- 叉車出租合同范例
- 水汽品質(zhì)劣化的原因及其處理方法
- 2023年軍隊文職人員(數(shù)學(xué)3+化學(xué))科目考試題庫(濃縮500多題)
- 小眼睛大手術(shù)-眼科顯微手術(shù)技能知到章節(jié)答案智慧樹2023年溫州醫(yī)科大學(xué)
- 2023石景山區(qū)高三一模數(shù)學(xué)試卷
- 國網(wǎng)基建各專業(yè)考試題庫大全-質(zhì)量專業(yè)-下(判斷題匯總)
- 社會生態(tài)系統(tǒng)下困境兒童多重困境分析共3篇
- 【信息技術(shù) 】計算機(jī)系統(tǒng)互聯(lián) 第1課時課件 教科版(2019)高中信息技術(shù)必修2
- 議論文閱讀訓(xùn)練10篇(附答案及解析)
- 山西省普通高級中學(xué)辦學(xué)基本標(biāo)準(zhǔn)
- 深圳體育中心綠色施工監(jiān)理細(xì)則
- 血液透析個案護(hù)理兩篇
評論
0/150
提交評論