我們今天來(lái)看下傳說(shuō)中的指針數(shù)組和數(shù)組指針。在 C 語(yǔ)言中,數(shù)組都有自己特定的類(lèi)型。那么數(shù)組的類(lèi)型是怎樣的呢?它是由元素類(lèi)型和數(shù)組大小共同決定的。比如 int array[5] 的類(lèi)型就是 int[5]。
創(chuàng)新互聯(lián)秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷(xiāo)的理念,以專(zhuān)業(yè)定制企業(yè)官網(wǎng),成都網(wǎng)站設(shè)計(jì)、成都網(wǎng)站建設(shè),小程序開(kāi)發(fā),網(wǎng)頁(yè)設(shè)計(jì)制作,手機(jī)網(wǎng)站制作,網(wǎng)絡(luò)營(yíng)銷(xiāo)推廣幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專(zhuān)業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶(hù)都以感恩的心態(tài)奉獻(xiàn)自己的專(zhuān)業(yè)和所長(zhǎng)。
在 C 語(yǔ)言中我們可以通過(guò) typedef為數(shù)組類(lèi)型重命名,格式為:typedef type(name)[size];其中數(shù)組類(lèi)型可以這樣表達(dá):typedef int(AINT5)[5]; typedef float(AFLOAT10)[10];那么數(shù)組定義就可表示為:AINT5 iarray; AFLOAT10 farray;
數(shù)組指針用于指向一個(gè)數(shù)組,數(shù)組名是數(shù)組首元素的起始地址但并不是數(shù)組的其實(shí)地址;通過(guò)取地址符 & 作用于數(shù)組名可以得到數(shù)組的起始地址,可通過(guò)數(shù)組類(lèi)型定義數(shù)組指針:ArrayType* pointer;也可以直接定義:type(*pointer)[n];其中 pointer 為數(shù)組指針變量名,type 為指向的數(shù)組的元素類(lèi)型,n 為指向的數(shù)組的大小。
我們下來(lái)通過(guò)示例代碼進(jìn)行分析,代碼如下
#include <stdio.h> typedef int(AINT5)[5]; typedef float(AFLOAT10)[10]; typedef char(ACHAR9)[9]; int main() { AINT5 a1; float fArray[10]; AFLOAT10* pf = &fArray; ACHAR9 cArray; char(*pc)[9] = &cArray; char(*pcw)[4] = cArray; int i = 0; printf("%d, %d\n", sizeof(AINT5), sizeof(a1)); for(i=0; i<10; i++) { (*pf)[i] = i; } for(i=0; i<10; i++) { printf("%f\n", fArray[i]); } printf("%p, %p, %p\n", &cArray, pc+1, pcw+1); return 0; }
我們來(lái)分析下這個(gè)代碼,在3-5行定義了三種類(lèi)型的數(shù)組,在第14行定義了一個(gè)類(lèi)型為 char[9] 的指針并將它指向 cArray,因?yàn)?cArray 的類(lèi)型也是 char[9],所以這句不會(huì)出錯(cuò)。在第10行定義了一個(gè)類(lèi)型為 char[4] 的指針,但用 cArry 初始化它,這就會(huì)出問(wèn)題。因?yàn)轭?lèi)型不同,所以會(huì)報(bào)錯(cuò)。在第23行,pf是指向數(shù)組 fArray 的指針,在這塊加 * 號(hào)相當(dāng)于取數(shù)組中的值,那么這句的意思就是給數(shù)組 fArray 賦值。在第31行,打印的第一個(gè)是數(shù)組 cArray 的地址,pc + 1相當(dāng)于指針運(yùn)算,也就是 (unsigned int)pc + sizeof(*pc) ==> (unsigned int)pc + 1 * 9; pcw + 1 ==> (unsigend int)pcw + sizeof(pcw) ==> (unsigned int)pcw + 1 *4;我們來(lái)看看編譯結(jié)果
我們看到程序在第15行只是報(bào)了個(gè)警告,最后三行的結(jié)果卻是如我們所分析的那樣。我們作為專(zhuān)業(yè)的程序猿,必須將每個(gè)警告都當(dāng)成錯(cuò)誤處理,因?yàn)榫嬉簿鸵馕吨绦虻倪\(yùn)行可能不正常,誰(shuí)也不知道會(huì)發(fā)生啥事。
我們下來(lái)再來(lái)講講指針數(shù)組,其實(shí)指針數(shù)組是一個(gè)普通的數(shù)組,它里面的每個(gè)元素為一個(gè)指針。指針數(shù)組的定義:type* pArray[n];其中 type* 為數(shù)組中每個(gè)元素的類(lèi)型,pArray 為數(shù)組名,n 為數(shù)組大小。
下來(lái)我們以示例代碼進(jìn)行分析,代碼如下
#include <stdio.h> #include <string.h> #define DIM(a) (sizeof(a)/sizeof(*a)) int lookup_keyword(const char* key, const char* table[], const int size) { int ret = -1; int i = 0; for(i=0; i<size; i++) { if( strcmp(key, table[i]) == 0 ) { ret = i; break; } } return ret; } int main() { const char* keyword[] = { "do", "for", "if", "register", "return", "switch", "while", "case", "static" }; printf("%d\n", lookup_keyword("return", keyword, DIM(keyword))); printf("%d\n", lookup_keyword("main", keyword, DIM(keyword))); return 0; }
我們這個(gè)函數(shù)的功能很簡(jiǎn)單,就是在一個(gè)指針數(shù)組中查找字符串,如果找到便返回它的編號(hào)。如果沒(méi)找到便返回 -1,我們看看編譯結(jié)果
我們看到函數(shù)確實(shí)實(shí)現(xiàn)了這個(gè)功能。通過(guò)對(duì)數(shù)組指針和指針數(shù)組的學(xué)習(xí),我們總結(jié)如下:1、數(shù)組的類(lèi)型由元素類(lèi)型和數(shù)組大小共同決定;2、數(shù)組指針是一個(gè)指針,指向?qū)?yīng)類(lèi)型的數(shù)組;指針數(shù)組是一個(gè)數(shù)組,其中每個(gè)元素都為指針;3、數(shù)組指針遵循指針運(yùn)算法則,指針數(shù)組擁有 C 語(yǔ)言數(shù)組的各種特性。
歡迎大家一起來(lái)學(xué)習(xí) C 語(yǔ)言,可以加我QQ:243343083。
當(dāng)前標(biāo)題:C之?dāng)?shù)組指針和指針數(shù)組(二十九)
網(wǎng)站URL:http://vcdvsql.cn/article30/gjeipo.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供企業(yè)網(wǎng)站制作、做網(wǎng)站、標(biāo)簽優(yōu)化、Google、網(wǎng)站制作、云服務(wù)器
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)