任何時(shí)候都可以使用數(shù)組,使用指針。
成都創(chuàng)新互聯(lián)是一家專注于成都網(wǎng)站建設(shè)、網(wǎng)站設(shè)計(jì)與策劃設(shè)計(jì),應(yīng)城網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:應(yīng)城等地區(qū)。應(yīng)城做網(wǎng)站價(jià)格咨詢:028-86922220
定義時(shí),通常只有字符指針,和字符數(shù)組指針直接定義。用來表示字符串或字符串?dāng)?shù)組。
其他一般定義數(shù)組。操作時(shí)用指針或數(shù)組。
其他指針,多半用在參數(shù)傳遞,數(shù)據(jù)結(jié)構(gòu)內(nèi)部(不確定需要內(nèi)存的大小,或者鏈表,二叉樹等鏈?zhǔn)浇Y(jié)構(gòu))的時(shí)候。
還有一種是有些函數(shù)參數(shù)就是指針,這時(shí)定義一個(gè)指針,來操作傳進(jìn)來的指針參數(shù)比較好。
指針作為參數(shù),有一下幾種用法,
1)當(dāng)作數(shù)組用,用來獲取或設(shè)置數(shù)組元素。
2)把一個(gè)比較長的數(shù)據(jù)結(jié)構(gòu)傳入函數(shù),只需要一個(gè)指針就夠了。
3)傳入變量的地址,用來讀取或修改變量的值,主要是為了修改用。
直接定義一個(gè)不指向任何對象的指針,并且也從不給他賦值,沒什么意義;
指針要么指向數(shù)組,要么指向變量,要么動(dòng)態(tài)申請內(nèi)存。
NULL指針,只是一個(gè)方便的指針,表示不指向任何對象。
真正有用的還是指向具體對象的指針。
如果定義了一個(gè)指針,使用時(shí)要讓他指向一個(gè)具體對象,當(dāng)需要他不指向什么對象的時(shí)候,給他賦值為NULL;
PS:
C語言,數(shù)組名只是一個(gè)指針常量而已,離開定義可見處,數(shù)組大小的信息就不存在了。
只有定義完全可見的地方,才可以獲得數(shù)組的大小。
數(shù)組作為函數(shù)的參數(shù),和外部引用聲明都不能獲得數(shù)組的大小。
參數(shù)只能傳遞指針,參數(shù)的大小只是指針的大??;
只能看到聲明的地方,獲取數(shù)組大小的努力,只能換來錯(cuò)誤。
void fun1(int a[10]) //== void fun1(int a[]) ==void fun1(int *a)
{
}
void fun2(int [10][10])// ==void fun2(int a[][10])== void fun2(int (*a)[10])
{
}
指針數(shù)組:數(shù)組成員是指針的數(shù)組。
作用:數(shù)組的屬性全有。因?yàn)槌蓡T是指針,這就可以延伸出很多內(nèi)容。包括:
成員是函數(shù)指針,整個(gè)數(shù)組就是一類相關(guān)函數(shù)的集合,便于代碼架構(gòu)的管理。
成員是鏈表指針啦,char指針,這種就是能做出類似散列表的結(jié)構(gòu)。
總體來講,就是一組相關(guān)數(shù)據(jù)的指針的集合,達(dá)到的目的就是搜集指向相關(guān)數(shù)據(jù)的指針放到一個(gè)集合里面。
同意樓上!
不能定義*d[0],因?yàn)檫@個(gè)數(shù)組的大小為0!
可以這樣來
#include stdio.h
#include stdlib.h
#include string.h
int main()
{
char *d[4];
d[0]=malloc(1*sizeof(char));
strcpy(d[0],"web");
printf("%s",d[0]);
return 0;
}
此時(shí)*d[]為一個(gè)指向指針的指針
d[0]=malloc(1*sizeof(char));
此句話的意思是,分配1個(gè)字節(jié)的內(nèi)存空間給d[0],也就意味著d這個(gè)數(shù)組的第一個(gè)元素[0]內(nèi)保存的是一個(gè)1字節(jié)空間的地址,因?yàn)閐[0]指向一個(gè)地址!
你可以這樣理解
對于普通的數(shù)組(例如 char d[4];),在內(nèi)存中是這樣的
變量:內(nèi)存地址:內(nèi)容
d[0]:0x400000h:'w'
d[1]:0x400001h:'e'
d[2]:0x400002h:'b'
d[3]:0x400003h:'\0'
而在此處 char *d[4]; *d[0] = malloc(1*sizeof(char));,是這樣的'
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400101h
d[2]:0x400002h:0x400102h
d[3]:0x400003h:0x400103h
而在內(nèi)存0x400100h處
才保存著"web\0"
不好意思,我上面說錯(cuò)了,應(yīng)該是
d[0]:0x400000h:0x400100h
d[1]:0x400001h:NULL
d[2]:0x400002h:NULL
d[3]:0x400003h:NULL
而在內(nèi)存0x400100h處
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
對應(yīng)的,你的代碼執(zhí)行后,內(nèi)存變量應(yīng)該是這樣的
d[0]:0x400000h:0x400100h
d[1]:0x400001h:0x400104h
d[2]:0x400002h:0x400108h
d[3]:0x400003h:NULL
在內(nèi)存0x400100處:
0x400100h:'w'
0x400101h:'e'
0x400102h:'b'
0x400103h:'\0'
0x400104h:隨機(jī)字符
......
0x400108h:隨機(jī)字符
以上內(nèi)存地址是以字節(jié)方式內(nèi)存對齊的,用一些編譯器編譯后可能地址會(huì)有些問題(比如d[0]到d[1]不止差了4,可能是8),但總體框架就是這樣!
int?**a可以表達(dá)一個(gè)二維數(shù)組。為什么呢?
你可以這么理解?*?p[3]表達(dá)的是一個(gè)數(shù)組指針,這個(gè)指針?p[0]表示的是數(shù)組存的第一個(gè)地址。而數(shù)組實(shí)際上是一串連續(xù)地址的塊。每一個(gè)小塊存著一個(gè)內(nèi)容。每次訪問數(shù)組時(shí),你為什么可以用數(shù)組名+下標(biāo)訪問呢??//比如a[i];
實(shí)際上就是?訪問*a+i;???*?這個(gè)符號(hào)可以表示你存的是變量的地址。而數(shù)組地址的第一位為int類型變量存的地址(你可以直接使用數(shù)組的地址加上單位變量的空間的大小去訪問下個(gè)元素)。在這個(gè)程序中int?*p[3]?表示可以存三個(gè)int?類型的地址。而p正好把二維數(shù)組的三個(gè)一維數(shù)組的開頭的int類型變量的地址給存起來了。
給你舉個(gè)例子
我現(xiàn)在輸出的是地址,是不是連續(xù)的?
用*運(yùn)算符獲取地址的內(nèi)容。
實(shí)際上p[i]與 *(p+i)是表達(dá)的是同一個(gè)意思。只不過只有數(shù)組可以定義一個(gè)連續(xù)的空間
(數(shù)組的第一個(gè)地址是隨機(jī)的其他的是連續(xù)的。)單獨(dú)用指針的話會(huì)隨機(jī)分配的
數(shù)組的指針可以存三個(gè)地址。當(dāng)然可以訪問二維數(shù)組了。