先看個(gè)簡(jiǎn)單的:char *p,這定義了一個(gè)指針,指針指向的數(shù)據(jù)類型是字符型,char *(p)定義了一個(gè)指針P;
char *p[4], 為指針數(shù)組,由于[]的優(yōu)先級(jí)高于*,所以p先和[]結(jié)合,p[]是一個(gè)數(shù)組,暫時(shí)把p[]看成是q,也就是char *(q),定義了一個(gè)指針q,只不過(guò)q是一個(gè)數(shù)組罷了,故定義了一個(gè)數(shù)組,數(shù)組里面的數(shù)據(jù)是char *的,所以數(shù)組里面的數(shù)據(jù)為指針類型。所以char *p[4]是四個(gè)指針,這四個(gè)指針組成了一個(gè)數(shù)組,稱為指針數(shù)組,既有多個(gè)指針組成的數(shù)組。
char(*p)[4],為數(shù)組指針,強(qiáng)制改變優(yōu)先級(jí),*先與p結(jié)合,使p成為一個(gè)指針,這個(gè)指針指向了一個(gè)具有4個(gè)char型數(shù)據(jù)的數(shù)組。故p中存放了這個(gè)char型數(shù)組的首地址,可用數(shù)組指針動(dòng)態(tài)內(nèi)存申請(qǐng):
char (*p)[10];
p=(char*)malloc(sizeof(char[x])*N);
char *f(char,char),為指針函數(shù),()的優(yōu)先級(jí)高于*,故f先與()結(jié)合,成為函數(shù)f(),函數(shù)的返回值是char *類型的,故返回值是一個(gè)指針。
char (*f)(char,char),為函數(shù)指針,*與f結(jié)合成為一個(gè)指針,這個(gè)指針指向函數(shù)的入口地址。函數(shù)名就是函數(shù)的首地址。函數(shù)指針是指向函數(shù)的指針變量。 因而“函數(shù)指針”本身首先應(yīng)是指針變量,只不過(guò)該指針變量指向函數(shù)。這正如用指針變量可指向整型變量、字符型、數(shù)組一樣,這里是指向函數(shù)。C在編譯時(shí),每一個(gè)函數(shù)都有一個(gè)入口地址,該入口地址就是函數(shù)指針?biāo)赶虻牡刂?。有了指向函?shù)的指針變量后,可用該指針變量調(diào)用函數(shù),就如同用指針變量可引用其他類型變量一樣,在這些概念上是一致的。函數(shù)指針有兩個(gè)用途:調(diào)用函數(shù)和做函數(shù)的參數(shù)。
int func(int x); /* 聲明一個(gè)函數(shù) */
int (*f) (int x); /* 聲明一個(gè)函數(shù)指針 */
f=func; /* 將func函數(shù)的首地址賦給指針f */
以后如果要調(diào)用函數(shù)func(),也就可以這樣調(diào)用:(*f)();
/****************************************************二級(jí)指針**************************************************/
二級(jí)指針簡(jiǎn)單來(lái)說(shuō)就是指向指針的指針。
char a=200;
char *p;
char **q;//q是一個(gè)二級(jí)指針
p=&a;
q=&p; //q指向指針p
假設(shè)變量a在內(nèi)存中的地址為2000H,則它們的關(guān)系就如下面的示意圖:
指針p指向a,p的值是2000H,*p就是取地址2000H中的值即a為200,而p本身的地址是4000H,q指向指針p,*q就是取地址4000H中的值即p的值為2000H,而**q就是取地址2000H中的值即200。
所以:
*p==200;
*q=2000H;
**q=200;
以上的q是一個(gè)指針指針的二級(jí)指針,然而還有指向數(shù)組的二級(jí)指針。
當(dāng)一個(gè)指針變量指向另一個(gè)指針變量時(shí),則形成二級(jí)指針。使用二級(jí)指針可以在建立復(fù)雜的數(shù)據(jù)結(jié)構(gòu)時(shí)提供較大的靈活性,能夠?qū)崿F(xiàn)其他語(yǔ)言所難以實(shí)現(xiàn)的一些功能。定義二級(jí)指針的形式是:
類型標(biāo)識(shí)符**二級(jí)指針變量名
定義指針的同時(shí)可以對(duì)其賦值,然后就可以使用了。
如果定義一個(gè)指針數(shù)組,則指針數(shù)組名就是一個(gè)二級(jí)指針。用指針數(shù)組元素值指向長(zhǎng)度同的字符串,操作時(shí)可以節(jié)省內(nèi)存空間,而對(duì)地址進(jìn)行操作,提高了運(yùn)行效率。
char s[3][5]={ "abc ", "uio ", "qwe "};
可以看成是三個(gè)指向字符串的一級(jí)指針(s[0],s[1],s[2]),由s[3]得。
而s[3]本身又是一個(gè)一維數(shù)組存儲(chǔ)s[0],s[1],s[2]三個(gè)一級(jí)指針,則s就可以看作是一個(gè)二級(jí)指針,即指向指針的指針。
這時(shí)定義一個(gè)二級(jí)指針char**p;就能通過(guò)p訪問(wèn)二維數(shù)組了。
也可以這樣char *p[] = {“ab“, “cd“, “ef“};定義了一個(gè)指針數(shù)組.
char **sp = p;
就可以使用sp[i]來(lái)訪問(wèn)字符串了。
大家都知道,要想在函數(shù)中改變形參的值,形參用指針傳遞就行了。
比如:
void f(char *p1,char *p2)
{
*p1=10;
*p2=20;
}
void main()
{
char a,b;
char *p,*q;
p=&a;
q=&b;
f(p,q);
}
執(zhí)行后此時(shí)a=10,b=20;
原理如下:
當(dāng)調(diào)用函數(shù)f后,p1指向a,p2指向b;
以上函數(shù),就實(shí)現(xiàn)了在函數(shù)中改變指針的值,使指針指向新申請(qǐng)的空間。
附:/*************************以下內(nèi)容轉(zhuǎn)載自http://msfengyun.spaces.live.com/blog/cns!7E7030E1847FD490!188.trak***////////////
指針是C語(yǔ)言的一大特色,它就像一把雙刃劍:使用得當(dāng)能夠給程序帶來(lái)極大的靈活性和高效性;反之,程序就會(huì)變得難以調(diào)試,漏洞百出!
眾所周知,指針實(shí)質(zhì)就是地址!一個(gè)變量的地址即稱為此變量的“指針”。如果有這樣一種變量:它的存儲(chǔ)單元里存放的是其它變量的地址!我們就稱之為“指針變量”。(請(qǐng)注意兩者之間的區(qū)別:兩個(gè)完全不同的概念!)
我們都知道,數(shù)組名和函數(shù)名就是它們的入口地址。同理,一個(gè)變量名其實(shí)也是此變量的所在地址!C語(yǔ)言中有一種運(yùn)算符為“&”:取址運(yùn)算符。因?yàn)閿?shù)組名與函數(shù)名本身代表的就是地址,通常不會(huì)對(duì)并且也不能對(duì)它們進(jìn)行取址操作或其它運(yùn)算操作(其實(shí)對(duì)于函數(shù)名的直接引用與對(duì)它取址是等價(jià)的)。這也是它們被稱為“常量”的原因!但對(duì)于一個(gè)變量來(lái)講,情況就不一樣了。要想獲得它的地址,就必須進(jìn)行“&”運(yùn)算,盡管它本身表示的也是地址值!而對(duì)變量直接進(jìn)行引用得到卻是它所在的內(nèi)存單元的數(shù)據(jù)內(nèi)容!“指針變量”作為一種變量當(dāng)然也不能例外!只不過(guò)它與其它普通變量的差別是,它的內(nèi)容是其它變量(包括“指針變量”)的地址,在WIN32上,它的大小恒為32位,4BYTE。而普通變量則不會(huì)有大小上的限制!對(duì)指針變量所指向的地址的數(shù)據(jù)內(nèi)容的獲取則是通過(guò)操作符“*”。在理解上我們將“提領(lǐng)操作符*”視為類型的一部分,并且這種數(shù)據(jù)類型是一種變量地址類型(均對(duì)每一個(gè)“*”而言)!
只要明白了以上常識(shí),“指針”將不會(huì)再是程序設(shè)計(jì)中的“攔路虎”!
從內(nèi)存的存儲(chǔ)映象的角度來(lái)講,C的規(guī)則數(shù)組(不包括通過(guò)數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)的多維數(shù)組)不存在多維,也就是說(shuō)所有的數(shù)組本質(zhì)上都是一維的,而一級(jí)指針就等價(jià)于一維數(shù)組!關(guān)鍵的不同在于多維數(shù)組與一維數(shù)組語(yǔ)義上的差別!而我們理解多維數(shù)組通常將之形象地描述成“矩陣”形式。更為精確的理解是多維數(shù)組的每個(gè)元素就是一個(gè)數(shù)組,如此遞歸下去直至最后每個(gè)元素是一個(gè)簡(jiǎn)單的變量類型,最終得到的就是一個(gè)特殊的一維數(shù)組!
看如下一個(gè)例程:
#include<stdio.h>
#include<stdlib.h>
void main()
{
int a[][3]={{250,250,250},{250,250,250}};
int* p=(int*)a;-------------------@
}
注:語(yǔ)句@在.C文件中可以寫成int* p=a;但會(huì)給出警告;若是在.CPP文件中寫成int* p=a;是通不過(guò)編譯的!所以規(guī)范起見(jiàn),最好在任何時(shí)候都要進(jìn)行強(qiáng)制類型轉(zhuǎn)換!
通過(guò)進(jìn)行調(diào)試,在WATHCH窗口中查看變量的內(nèi)存地址情況如下:
從圖上可以看出二維數(shù)組在內(nèi)存單元中是線性增長(zhǎng)的。倘若此時(shí)有一個(gè)二級(jí)指針int** q=NULL;如何通過(guò)q來(lái)操作二維數(shù)組a[2][3]呢?
通過(guò)q=a;如何呢?在.C文件中可以編譯通過(guò),但會(huì)給出警告。若是在.CPP文件中則不會(huì)編譯通過(guò)!我相信很多人的第一反應(yīng)是加上強(qiáng)制類型轉(zhuǎn)換:q=(int**)a;如此以來(lái),程序編譯、鏈接暢通無(wú)阻,連警告也沒(méi)有!但一運(yùn)行就會(huì)出問(wèn)題:這是當(dāng)然的!下面進(jìn)行詳細(xì)分析。。。。。。
根據(jù)我上面講述的:q可視為int**類型,且是int*變量的地址類型變量!對(duì)q (指針變量)的引用,得到是的其(即q)內(nèi)存單元的數(shù)據(jù),即int*變量的地址,*q則是獲取q所指向的int*變量類型地址的內(nèi)容,相當(dāng)于int* Q變量Q的直接引用,得到是int類型變量的地址。q所占的內(nèi)存為4BYTE,*q所占的內(nèi)存也為4BYTE。一切都清楚了。
現(xiàn)在來(lái)分析二維數(shù)組a的數(shù)據(jù)類型。我們知道指針與數(shù)組的聯(lián)系的常見(jiàn)具體應(yīng)用有兩種:一種是“數(shù)組指針”:形如(*ptr)[];另外一種是“指針數(shù)組”:形如*ptr[]。兩者之間的區(qū)別想必大家都清楚。如果我定義一個(gè):“數(shù)組指針”并初始化:int (*pp)[3]=a;那么通過(guò)pp完全可以操作a[2][3]。來(lái)分析一下“數(shù)組指針”(*ptr)[SIZE],ptr所指的對(duì)象是有SIZE個(gè)某種數(shù)據(jù)類型值的數(shù)組。而ptr本身又是一級(jí)指針,一級(jí)指針又等價(jià)于一維數(shù)組。a[2][3]的低維是一個(gè)維度為3的一維數(shù)組。高維是一個(gè)維度為2的一維數(shù)組,不難理解,正如前面所述:二維數(shù)組的每個(gè)元素是一個(gè)一維數(shù)組,相當(dāng)于一維數(shù)組的兩次嵌套。比如變量a[0]是一個(gè)維度為3的一維數(shù)組,a[1]亦是一樣。這樣一來(lái),高維的那一部分可視為一個(gè)指針!一個(gè)膽大的設(shè)想出來(lái)了:二維數(shù)組本質(zhì)上就等同于“數(shù)組指針”!這種想法雖然無(wú)懈可擊,但想歸想,事實(shí)是怎樣的還得驗(yàn)證?,F(xiàn)借用C++的類型識(shí)別,得出兩者的數(shù)據(jù)類型:(以下語(yǔ)句需用頭文件<typeinfo>)
cout<<typeid(a).name()<<endl;
cout<<typeid(pp).name()<<endl;
輸出結(jié)果為:int (*)[3](換行) int (*)[3]
兩者完全相同,與設(shè)想一致!
現(xiàn)在回到問(wèn)題上來(lái),q=(int**)a;強(qiáng)制轉(zhuǎn)換成功,但卻不可能正確運(yùn)行!原因已浮出水面:q這個(gè)地址單元存放的是int*類型的“指針變量”的地址,而二維數(shù)組a骨子里卻是一個(gè)“數(shù)組指針”。兩者完全是“八竿子打不著”!想一想它們的內(nèi)存分布情況,前者(地址)所指向的內(nèi)存大小恒為4BYTE,后者(地址)所指向的內(nèi)存大小是隨著你定義的數(shù)組維數(shù)而不斷變化的!即使通過(guò)強(qiáng)制類型轉(zhuǎn)換成功,q的內(nèi)存值就是a所代表的地址,但這個(gè)地址僅僅是一個(gè)地址,而q的內(nèi)存值不僅要求是一個(gè)地址,而且還必須是一個(gè)“指針變量”的地址!只有這樣通過(guò)*q(前面說(shuō)過(guò):*q則是獲取q所指向的int*變量類型地址的內(nèi)容,即一個(gè)int變量的地址)才能操作一個(gè)普通變量的地址,否則就是用“*”來(lái)操作普通變量,想一下int x=250;*x表示的是什么呢?
或許有人會(huì)問(wèn):你不是說(shuō)二維數(shù)組實(shí)質(zhì)上就是一維數(shù)組嗎,怎么二維數(shù)組實(shí)質(zhì)上又是“數(shù)組指針”?這里有必要強(qiáng)調(diào)一下:我是從它們的存儲(chǔ)映象上來(lái)講的,但編譯器的語(yǔ)義實(shí)現(xiàn)上兩者是絕不能劃等號(hào)的!你能夠?qū)⒁粋€(gè)二維數(shù)組賦值給一個(gè)一維數(shù)組嗎?顯然是不行的!因此我們這樣想:語(yǔ)句q=(int**)a;是將一個(gè)一維數(shù)組(等價(jià)于一級(jí)指針)賦給一個(gè)二級(jí)指針(要通過(guò)“&”賦一級(jí)指針的地址才行),地球人都知道這是行不通的!雖然乍聽起來(lái)還蠻合理的,其實(shí)此般理解無(wú)異于穿鑿附會(huì)。剛才解釋過(guò),兩者的語(yǔ)義迥異!不過(guò),這樣理解似乎更能深刻且方便地知道那樣做錯(cuò)在哪里了,呵呵。。。。。。
另:
/*******************************以下內(nèi)容轉(zhuǎn)載自http://zhidao.baidu.com/question/126882280*************///////////////////////////
#include <iostream.h>
void main()
{
int a[2][3];
int**p=a;
}
請(qǐng)問(wèn)為什么是錯(cuò)誤的??(請(qǐng)不要說(shuō)數(shù)組名是一個(gè)指針這個(gè)我知道,我想知道為什么不能用二級(jí)指針指向二維數(shù)組)
本來(lái)不想寫什么的,但是看看,我覺(jué)得都沒(méi)有我想要的答案,于是我像樓主推薦我的拙見(jiàn)。其實(shí)這個(gè)數(shù)組與指針的問(wèn)題,要寫的話,一句話,兩句話是將不清楚的。首先數(shù)組和指針的概念你沒(méi)分清楚,數(shù)組的本質(zhì)你沒(méi)搞清楚。這是導(dǎo)致問(wèn)題出現(xiàn)的根源。int x[5]; 這個(gè)定義里面,我們說(shuō)定義了一個(gè)數(shù)組x,此數(shù)組有5個(gè)數(shù)組元素,元素的類型為int類型。首先要問(wèn)的是,x到底為什么東西? 我知道,在譚浩強(qiáng)的書上面說(shuō)x是數(shù)組名,x代表了數(shù)組第一個(gè)元素的首地址。沒(méi)錯(cuò),x確實(shí)是數(shù)組的名字,x的值也確實(shí)是第一個(gè)數(shù)組元素的地址值。注意這里我們說(shuō)x代表的值與數(shù)組第一個(gè)元素的地址值相等,但是并不是說(shuō)他們的類型是一樣的。那么x的類型到底是什么呢? 有人說(shuō)就是int * 類型。有如下語(yǔ)句可以做證:int *p=x; //這句話是正確的。x的類型真是int *嗎,我們說(shuō)不是,因?yàn)橄旅娴恼Z(yǔ)句是不正確的:int a=10;x=&a; // int *類型的變量時(shí)可以接受值的。所以x不是int*那么我們可以猜測(cè)x的類型是不是 int *const呢。也就是說(shuō)x是一個(gè)地址值不可以改變的指針。這句話貌似有點(diǎn)正確。但是請(qǐng)大家看看下面的例子:int x[5]={0};int a=sizeof(x); // a的值到底是多少?實(shí)際上這里a的值是5*4=20我這里使用的編譯器是VC++ 6.0 int類型數(shù)據(jù)占用4個(gè)字節(jié)空間,所以這里的道的是整個(gè)數(shù)組占用的字節(jié)數(shù)。 我們不是說(shuō)x的類型是iint * const類型的嗎,也就是x應(yīng)該是一個(gè)指針類型,應(yīng)該是4個(gè)字節(jié)的啊,為什么sizeof出來(lái)時(shí)整個(gè)數(shù)組占用的字節(jié)數(shù)呢。例如sizeof(int *)這個(gè)的結(jié)果就是4。所以有此可以看出,x的類型并不是int*,也不是int * const。int x[5];中的x到底是什么呢,我們說(shuō)x是數(shù)組,此數(shù)組有5個(gè)元素,并且每個(gè)元素都是int類型。 我們有一個(gè)識(shí)別數(shù)據(jù)類型的規(guī)律例如:int x; //x類型為intint *x;//x類型為int *int **x;//x類型為int **int (*x)[10];//x類型為int(*)[10]實(shí)際上是指向數(shù)組的指針int (*x)(int ,int);//x的類型為int(*)(int,int)實(shí)際上是指向函數(shù)的指針由此可以看出,一個(gè)符號(hào)是什么數(shù)據(jù)類型,我們只要在其定義的表達(dá)式中去掉符號(hào)本身,剩下的就是符號(hào)的類型了。照此推斷,int x[5];中x的類型應(yīng)該是 int [5]這個(gè)類型,可以看出此類型并不是int *類型。那么int x[5];中的x可以這樣賦值: int *p=x; 為什么呢,只能說(shuō)這里面將x的類型隱式轉(zhuǎn)換為了int *類型。所以這里是可以賦值的,因?yàn)檫M(jìn)行了類型轉(zhuǎn)換。 再請(qǐng)看下面的例子:void function(int x[5]){cout<<sizeof(x)<<endl; //這里輸出4}為什么會(huì)輸出4,而不是4*5呢,可以看出上面的函數(shù)形參實(shí)際上類型是int*,并不是數(shù)組類型,所以我們?cè)诙x函數(shù)的時(shí)候,下面的都是與上面等價(jià)的:void function(int x[])//元素個(gè)數(shù)是多少可以省略{cout<<sizeof(x)<<endl; //這里輸出4}void function(int *x) //直接寫成指針變量也沒(méi)錯(cuò){cout<<sizeof(x)<<endl; //這里輸出4}他們都是等價(jià)的。那么我們看一個(gè)類似的問(wèn)題:int x[5];int **p=&x; //為什么會(huì)報(bào)錯(cuò)? 因?yàn)轭愋筒黄ヅ?。p的類型是int **,而&x的類型卻不是int **。 &x的類型實(shí)際上是int(*)[5],因?yàn)槿サ氖莤的地址,也就是說(shuō)這個(gè)地址是數(shù)組的地址,并不是指向數(shù)組第一個(gè)元素的指針的指針(也就是二維指針),而是整個(gè)數(shù)組的地址。所以我們可以改成下面的:int (*p)[5]=&x;//這就對(duì)了。指向數(shù)組的指針,和指向數(shù)組元素的指針有什么不同?我們說(shuō)對(duì)于一個(gè)指針變量,要幾點(diǎn)是我們必須注意的,例如int *p;我們要注意的是,p的類型是int*,p占用的空間4個(gè)字節(jié),p指向的數(shù)據(jù)類型是int。p指向的數(shù)據(jù)類型占用4個(gè)字節(jié)。所以對(duì)于指針變量,我們要明白指針變量本身是占用空間的,本身是有類型的,其次指針變量所指向的空間是有類型的,是有空間的。那么int *p; char *p1; 對(duì)于指針變量來(lái)說(shuō)p,p1里面都放的是地址值,說(shuō)白了就是一個(gè)數(shù)值,他們都占用4個(gè)字節(jié)的空間,但是他們的類型不一樣,p里面的地址指向的是int類型的數(shù)據(jù),p1指向的是char類型的數(shù)據(jù),這主要體現(xiàn)在p++與p1++中他們?cè)趦?nèi)存中移動(dòng)的字節(jié)數(shù)是不一樣的,我們假設(shè)int占4個(gè)字節(jié),char占1個(gè)字節(jié)。那么對(duì)于p來(lái)說(shuō)向前移動(dòng)了4個(gè)字節(jié),p1來(lái)說(shuō)移動(dòng)了一個(gè)字節(jié)。這就是他們的類型不同,導(dǎo)致運(yùn)算過(guò)程中的不同。int x[5];int (*p3)[5]; 此時(shí)p3指向數(shù)組x,那么p3++實(shí)際上向前移動(dòng)了多少呢,可以算出移動(dòng)了4*5個(gè)字節(jié)。也就是p3指向的是一個(gè)數(shù)組,是整個(gè)數(shù)組,所以p3移動(dòng)的時(shí)候是將一個(gè)數(shù)組當(dāng)做一個(gè)整體來(lái)看待的。所以向前移動(dòng)了一整個(gè)數(shù)組的距離。再看你的問(wèn)題之前,我們來(lái)看一個(gè)類似的問(wèn)題:int a[2][3];int**p=&a; //這里我用&a來(lái)賦值行不行呢。是不行的。這里為什么是錯(cuò)誤的,原因就是因?yàn)?amp;a的類型不是int**類型。所以類型不兼容,導(dǎo)致不能賦值,同時(shí)這兩種類型是不可以相互轉(zhuǎn)換的。 那么&a到底是一個(gè)什么樣的類型呢。 我們說(shuō)&a去的是整個(gè)數(shù)組的地址,那么&a自然就是指向整個(gè)數(shù)組的指針了。 int (*p)[2][3]=&a; 此時(shí)這樣賦值才是正確的。如果我們要用a直接賦值,那該定義一個(gè)什么樣的變量來(lái)接受它呢,首先要明白,數(shù)組名代表的地址類型是指向數(shù)組的第一個(gè)元素的指針,例如:int a[10];int *p=a; 實(shí)際上這里與 int *p=&a[0];是等價(jià)的。因?yàn)橹赶騛[0]的指針類型就是int*類型。 那么&a的是去數(shù)組的地址,其類型是指向數(shù)組的指針,而不是指向數(shù)組第一個(gè)元素的指針,整個(gè)是要區(qū)別的,他們的類型就不一樣。 int(*p)[10]=&a;所以說(shuō)這里的a和&a絕對(duì)不是同一個(gè)東西,雖然本質(zhì)上他們的地址值是一樣的,但是他們的類型不一樣。就決定他們代表不同的意義。那么剛剛說(shuō)了對(duì)于下面的例子:int a[2][3];int (*p)[2][3]=&a;//我們可以定義這樣的一個(gè)變量p來(lái)接受&a的值。那么我們要接受a應(yīng)該定義一個(gè)什么樣的變量呢。a[2][3]是一個(gè)二維數(shù)組,可以看成是這樣的a是一個(gè)數(shù)組,具有兩個(gè)元素,分別為a[0],a[1]其中這兩個(gè)元素的值a[0],a[1]他們的值又是一個(gè)具有3個(gè)元素的數(shù)組。此時(shí)我們可以將a[0],a[1]看成是數(shù)組名,那么a[0][0]就是數(shù)組a[0]的第0個(gè)元素了。對(duì)應(yīng)關(guān)系如下:a[0] ----> a[0][0],a[0][1],a[0][2]a[1] ----> a[1][0],a[1][1],a[1][2]那么a到底是什么,其實(shí)a數(shù)組有兩個(gè)元素,a[0],a[1],那么a的值自然就是其第一個(gè)元素的地址了,也就是&a[0]了。這是一個(gè)什么類型? 我們知道如果我們將a[0]看成一個(gè)整體,例如我們用A來(lái)代替a[0],那么A[0],A[1]就相當(dāng)于a[0][0],a[0][1] 。 此時(shí)A就是一個(gè)int類型的數(shù)組,&A,的類型實(shí)際上就是 int(*p)[3]這個(gè)類型。所以下面的代碼也是正確的:int a[2][3];int(*p)[3]=a; //所以對(duì)于你的問(wèn)題,可以這樣子。。
聯(lián)系客服