C 指標 指標與陣列

2021-07-02 21:15:18 字數 3527 閱讀 3895

1. 一維陣列與指標

* 陣列指標

陣列的首位址稱為陣列指標。若定義整型陣列a[5],系統為陣列分配的位址從1000到1019,則陣列a的首位址1000為陣列a的陣列指標。

c++規定,陣列的首位址可用陣列名a表示,因此,陣列a的陣列指標=a=&a[0]。

* 陣列指標變數

int a[5];

int *p=&a[0];

則p為陣列指標變數。

但陣列名a不能用來進行賦值運算、"++"、"- -"等運算。

當指標變數指向陣列首位址後,就可使用該指標變數對陣列中任何乙個元素變數進行訪問操作。

# include 

void main( void)

,i,j,*p,n=5;

p=a;

for (i=0;icout

<<*p<<'\t';

p++;

} cout

<<*(p+i)<< '\t';

cout

<<*(a+i)<< '\t';

cout

<'\t';

cout

<012

3401

2340

1234

0123

4

(1)通過移動指標變數,依次訪問陣列元素。如:
p=a; 

for (i=0;i

i++)

注意:cout<<*p<<'\t'; p++;可合併為一條語句:cout<<*p++<<'\t';

(2)指標變數不變,用p+i或 a+i 訪問陣列第i個元素。如:

for (i=0;i

i++) cout <<*(p+i)<< '\t';

for (i=0;i

i++) cout <<*(a+i)<< '\t';

在c++中允許用p+i 或a+i 表示第i 個元素的位址。因此,*(p+i)與*(a+i)均表示第i個元素的內容。

(3)以指標變數名作為陣列名訪問陣列元素。如:

for (i=0;ip作為陣列名,則p

[i]表示陣列的第i個元素a

[i]。

* 陣列元素的引用

綜上所述,對一維陣列a[ ]而言,當p=a後,有如下等同關係成立:

① p+i=a+i=&a[i],即p+i、a+i 均表示第i個元素的位址&a[i]。

② *(p+i) =*(a+i)=p[i]= a[i]。即*(p+i), *(a+i), p[i]均表示第i個元素值a[i]。

其中p[i] 的執行效率最高。

由上所述可知:一維陣列的第i個元素可用四種方式引用,即: a[i]、*(p+i) 、*(a+i)、p[i]。

2.二維陣列與指標

*  二維陣列元素在記憶體中的存放方式

在c++中,二維陣列元素值在記憶體中是按行的順序存放的。

* 二維陣列行首位址

二維陣列各元素按行排列可寫成

a[0]=(a[0][0],a[0][1],a[0][2])

a[1]=(a[1][0],a[1][1],a[1][2])

a[2]=(a[2][0],a[2][1],a[2][2])

因為陣列名可用來表示陣列的首位址,所以一維陣列名a[i]可表示一維陣列 (a[i][0],a[i][1],a[i][2])的首位址&a[i][0],

即可表示第i行元素的首位址。

* 二維陣列行位址

為了區別陣列指標與指向一維陣列的指標,c++引入了行位址的概念,並規定二維陣列a中第i行位址用a+i或&a[i]表示,

a+i=&a[i]=a[i]=&a[i][0]

int a[3][3];

int *p=a+0;

int *p=(int *) (a+0);

二維陣列名a可用於表示二維陣列的首位址,但c++規定該首位址並不是二維陣列中第0行第0列的位址(即a≠a[0][0]),

而是第0 行的行位址,即a=a+0=&a[0]。

* 二維陣列的元素位址與元素值

知道了二維陣列的行位址與行首位址後,可以討論二維陣列的元素位址。

a[i]+j 、*(a+i)+j、&a[i][0]+j、&a[i][j]

第i行行位址 a+i、&a[i]

第i行首位址(第i行第0列位址) a[i]、 *(a+i)、 &a[i][0]

元素a[i][j]的位址 a[i]+j 、*(a+i)+j 、&a[i][0]+j、&a[i][j]

第i行第j列元素值 *(a[i]+j) 、 *(*(a+i)+j) 、 *(&a[i][0]+j)、a[i][j]

最後總結例子:

# include void main(void)

,,};

for (int i=0

;i<3;i++)} }

程式執行後輸出結果為:

&a[0]= 0x0065fdd4=0x0065fdd4

a[0]= 0x0065fdd4=0x0065fdd4=0x0065fdd4

&a[0][0]= 0x0065fdd4=0x0065fdd4=0x0065fdd4=0x0065fdd4

a[0][0]=1=1=1=1

&a[0][1]= 0x0065fdd8=0x0065fdd8=0x0065fdd8=0x0065fdd8

a[0][1]=2=2=2=2

&a[0][2]= 0x0065fddc=0x0065fddc=0x0065fddc=0x0065fddc

a[0][2]=3=3=3=3

&a[1]= 0x0065fde0=0x0065fde0

a[1]= 0x0065fde0=0x0065fde0=0x0065fde0

&a[1][0]= 0x0065fde0=0x0065fde0=0x0065fde0=0x0065fde0

a[1][0]=4=4=4=4

&a[1][1]= 0x0065fde4=0x0065fde4=0x0065fde4=0x0065fde4

a[1][1]=5=5=5=5

&a[1][2]= 0x0065fde8=0x0065fde8=0x0065fde8=0x0065fde8

a[1][2]=6=6=6=6

&a[2]= 0x0065fdec=0x0065fdec

a[2]= 0x0065fdec=0x0065fdec=0x0065fdec

&a[2][0]= 0x0065fdec=0x0065fdec=0x0065fdec=0x0065fdec

a[2][0]=7=7=7=7

&a[2][1]= 0x0065fdf0=0x0065fdf0=0x0065fdf0=0x0065fdf0

a[2][1]=8=8=8=8

&a[2][2]= 0x0065fdf4=0x0065fdf4=0x0065fdf4=0x0065fdf4

a[2][2]=9=9=9=9

C 指標陣列與陣列指標

說實話,c語言真的很讓人蛋疼,它不像物件導向的語言,我們重心在設計程式上。而使用c語言,你不僅要考慮程式的設計,你還要考慮很多他的使用細節,不然一不小心你怎麼死的都不知道。但是,個人感覺,c語言的魅力是其他任何語言都比不了的!繼續看。陣列指標 範例 typedef int aint5 5 typed...

C 指標陣列與陣列指標

陣列指標 也稱行指標 陣列指標 a pointer to an array,即指向陣列的指標 定義 int p n 優先順序高,首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長。也就是說執行p 1時,p要跨過n個整型資料的長度。如要將二維陣列賦給一指標,應這樣...

指標陣列與陣列指標 C

關於陣列指標 1 對於二維陣列,初始化時,必須指定乙個引數 int a 3 int a 這樣是不允許的,因為要確定指標移動一步要走多遠。對於一位陣列int a 這樣可以。也就數說只有乙個引數位置可以不用設定引數。2 int p 3 必須加上小括號,這代表乙個指向陣列的指標,數字3,代表每一列有三個數...