指针数组/数组指针
C/C++中有兩個(gè)非常容易混淆的十分常用的但是又特別不引起人注意的兩個(gè)概念,指針數(shù)組和數(shù)組指針,或許你已經(jīng)對(duì)這兩個(gè)概念早有耳聞,但是不知你有沒有對(duì)他們做過細(xì)致的分析來(lái)區(qū)別二者呢?
? ? 下面我們來(lái)看下百度百科上是如何對(duì)二者進(jìn)行定義的
? ? 數(shù)組指針
一:數(shù)組指針:數(shù)組名本身就是一個(gè)指針,指向數(shù)組的首地址。注意這是聲明定長(zhǎng)數(shù)組時(shí),其數(shù)組名指向的數(shù)組首地址是常量。而聲明數(shù)組并使某個(gè)指針指向其值指向某個(gè)數(shù)組的地址(不一定是首地址),指針取值可以改變。
二:數(shù)組指針:是指向數(shù)組的一個(gè)指針,如int (*p)[10] 表示一個(gè)指向10個(gè)int元素的數(shù)組的一個(gè)針。 ??
? ?
? ? 指針數(shù)組
? ? 一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組。 也就是說,指針數(shù)組中每一個(gè)元素都相當(dāng)于一個(gè)指針變量。其詳細(xì)形式應(yīng)該如下: *a[0], ...*a[n]. 每一個(gè)數(shù)組里面存儲(chǔ)的是其指向的地址;一維指針數(shù)組的定義形式為:類型名 *數(shù)組名[數(shù)組長(zhǎng)度]
例如:int *p[4],由于[]比*優(yōu)先級(jí)更高,因此p先與[4]結(jié)合,形成p[4]的形式,這顯然是數(shù)組形式。然后再與p前面的*結(jié)合,*表示此數(shù)組是指針類型的,每個(gè)數(shù)組元素都指向一個(gè)整型變量。
?
? ? demo:
? ? 從上面的對(duì)比分析中我們可以清楚的知道二者的區(qū)別,關(guān)鍵就在于*和[]優(yōu)先級(jí)上的問題,下面通過一個(gè)例子來(lái)分析一下。
?
聲明 char *ponitArray[] = {"stately" , "plump" , "buck" , "mulligan"}; 由定義知這是一個(gè)指針數(shù)組,那么sizeof(pointArray)=?呢,因?yàn)閜ointArray是一個(gè)存放指針的數(shù)組,而存放指針其實(shí)存放的是地址,一般用4個(gè)字節(jié)表示,而數(shù)組大小為4,故而結(jié)果就為4*4 = 16.
?
char (*arrayPoint)[4]; char t[4]="123"; arrayPoint=&t; cout<<"*A = "<<*arrayPoint<<"\tA = "<<arrayPoint<<endl;
上面幾行代碼輸出結(jié)果應(yīng)該是什么呢?,首先arrayPoint是一個(gè)指針,指向一個(gè)存放4個(gè)字符的C風(fēng)格字符串,從這里我們可以知道arrayPoint其實(shí)是一個(gè)32位(一般)的整數(shù),所有下一步我們要將一個(gè)長(zhǎng)度為4的字符串地址賦給該指針,即arrayPoint=&t;,故可知輸出結(jié)果就為“123”和字符串t的地址。
? ? 下面我們來(lái)看下百度百科上是如何對(duì)二者進(jìn)行定義的
? ? 數(shù)組指針
一:數(shù)組指針:數(shù)組名本身就是一個(gè)指針,指向數(shù)組的首地址。注意這是聲明定長(zhǎng)數(shù)組時(shí),其數(shù)組名指向的數(shù)組首地址是常量。而聲明數(shù)組并使某個(gè)指針指向其值指向某個(gè)數(shù)組的地址(不一定是首地址),指針取值可以改變。
二:數(shù)組指針:是指向數(shù)組的一個(gè)指針,如int (*p)[10] 表示一個(gè)指向10個(gè)int元素的數(shù)組的一個(gè)針。 ??
? ?
? ? 指針數(shù)組
? ? 一個(gè)數(shù)組,若其元素均為指針類型數(shù)據(jù),稱為指針數(shù)組。 也就是說,指針數(shù)組中每一個(gè)元素都相當(dāng)于一個(gè)指針變量。其詳細(xì)形式應(yīng)該如下: *a[0], ...*a[n]. 每一個(gè)數(shù)組里面存儲(chǔ)的是其指向的地址;一維指針數(shù)組的定義形式為:類型名 *數(shù)組名[數(shù)組長(zhǎng)度]
例如:int *p[4],由于[]比*優(yōu)先級(jí)更高,因此p先與[4]結(jié)合,形成p[4]的形式,這顯然是數(shù)組形式。然后再與p前面的*結(jié)合,*表示此數(shù)組是指針類型的,每個(gè)數(shù)組元素都指向一個(gè)整型變量。
?
? ? demo:
? ? 從上面的對(duì)比分析中我們可以清楚的知道二者的區(qū)別,關(guān)鍵就在于*和[]優(yōu)先級(jí)上的問題,下面通過一個(gè)例子來(lái)分析一下。
?
聲明 char *ponitArray[] = {"stately" , "plump" , "buck" , "mulligan"}; 由定義知這是一個(gè)指針數(shù)組,那么sizeof(pointArray)=?呢,因?yàn)閜ointArray是一個(gè)存放指針的數(shù)組,而存放指針其實(shí)存放的是地址,一般用4個(gè)字節(jié)表示,而數(shù)組大小為4,故而結(jié)果就為4*4 = 16.
?
char (*arrayPoint)[4]; char t[4]="123"; arrayPoint=&t; cout<<"*A = "<<*arrayPoint<<"\tA = "<<arrayPoint<<endl;
上面幾行代碼輸出結(jié)果應(yīng)該是什么呢?,首先arrayPoint是一個(gè)指針,指向一個(gè)存放4個(gè)字符的C風(fēng)格字符串,從這里我們可以知道arrayPoint其實(shí)是一個(gè)32位(一般)的整數(shù),所有下一步我們要將一個(gè)長(zhǎng)度為4的字符串地址賦給該指針,即arrayPoint=&t;,故可知輸出結(jié)果就為“123”和字符串t的地址。
總結(jié)
- 上一篇: Android安卓备忘录(笔记)大作业简
- 下一篇: 求解一元三次方程近似解的几种算法(C语言