C語言快速入門系列(七) C語言快速入門系列(七) C語言指針進(jìn)階 本章引言: 在前面第5節(jié)中我們對C語言的指針進(jìn)行了初步的學(xué)習(xí)理解;作為C語言的靈魂, C指針肯定沒那么簡單,在這一節(jié)中,我們將會(huì)對指針進(jìn)行進(jìn)一步的學(xué)習(xí),比如二級指針, 指針數(shù)組,內(nèi)存分配和const修飾指針常量等!下面就請大家跟隨筆者的腳步,對 C指針神秘的一面進(jìn)行進(jìn)一步的解析吧! 本節(jié)學(xué)習(xí)路線圖:函數(shù)與指針:①指針作為函數(shù)的形參:②指向函數(shù)的指針:③指針函數(shù):④帶參數(shù)的主函數(shù)ps:該代碼的運(yùn)行:先要編譯生成exe文件后,來到exe所在文件目錄下:輸入: 文件名 one two three 會(huì)輸出:one two three 指針數(shù)組:兩個(gè)問題:如何保存一個(gè)字符串?如果保存的不止一個(gè),而是多個(gè)呢? 第一個(gè)問題: ①char name[20] = "~~~" ②char *name = "~~~" //前者定義了長度,不能直接賦值,明顯后者比較靈活 第二個(gè)問題:見圖 二級指針:內(nèi)存的動(dòng)態(tài)分配:代碼示例: 動(dòng)態(tài)分配10個(gè)整型的空間大小,如果大于這個(gè)數(shù)目則動(dòng)態(tài)分配,否則利用realloc重新分配內(nèi)存 ps:代碼沒問題,vc6一直報(bào)運(yùn)行時(shí)錯(cuò)誤,如果出錯(cuò)了,用C-Free或者Visual studio等編譯器試試! <span style="font-family:Microsoft YaHei;">#include <stdio.h> #include <stdlib.h> #define N 10 int main() { int *p = 0; int i,num,*q = 0; p = (int *)malloc((N * sizeof(int))); if(p == 0) { printf("內(nèi)存分配錯(cuò)誤!\n"); exit(0); } printf("請輸入要存儲(chǔ)的元素個(gè)數(shù):\n"); scanf("%d",&num); if(num <= N) { for(i = 0;i < N;i++) scanf("%d",p+i); } else { for(i = 0;i < num;i++) q = (int *)realloc(p,(N + N)*sizeof(int)); if(q == 0)exit(0); for(i = 0;i < num;i++) scanf("%d",q + i); p = q; } for(i = 0;i < num;i++) printf("%3d",*(p+i)); printf("\n"); free(p); return 0; }</span>
使用const修飾指針變量我們都知道使用const修飾一個(gè)基本數(shù)據(jù)類型的變量,可以讓變量存儲(chǔ)的值從頭到尾都不變 我們的程序不能進(jìn)行修改!不過修飾指針變量就有點(diǎn)差異了: 比如: int a = 3,b = 4; const int *p = &a; 如果我們再添加一句代碼: p = &b;的話就會(huì)報(bào)錯(cuò) 如果添加: a = 5;代碼并不出錯(cuò),此時(shí) *p == a == 5; 分析結(jié)果: 使用const修飾指針時(shí),表明該指針是一個(gè)常量指針,它所指向的變量的值是可以修改的; 但是修改指針指向的地址則是錯(cuò)誤的!!! 在C許多的標(biāo)準(zhǔn)庫函數(shù)都將某些指針參數(shù)的類型前加上const,目的是保護(hù)參數(shù)! ps:int *const p = &a; const int * const p = &a; 和上面的都是等價(jià)的! 本章小結(jié):①函數(shù)與指針: 1.指針作為函數(shù)的形參: 指針參數(shù)對應(yīng)的實(shí)參需要為變量地址 2.指向函數(shù)的指針:函數(shù)的首地址稱為函數(shù)的指針,通過函數(shù)名可以找到并且執(zhí)行函數(shù) 3.指針函數(shù):返回值類型是一個(gè)指針 4.帶參數(shù)的主函數(shù): int main(int argc,char *argv[]) :形參依次為:記錄參數(shù)個(gè)數(shù)和存儲(chǔ)參數(shù)內(nèi)容的字符串?dāng)?shù)組 ②指針數(shù)組 二維數(shù)組存放字符串與指針數(shù)組存放字符串的比較 ③二級指針 指向指針變量的指針 ④內(nèi)存的動(dòng)態(tài)分配: 1.內(nèi)存分配圖 2.C語言提供的四個(gè)內(nèi)存分配函數(shù)的使用:malloc(),calloc(),realloc(),free()的使用 ⑤使用const修飾指針變量 可以修改的指向地址的變量的值,不能修改的是指針?biāo)赶虻牡刂? |
|