陣列和指標

2021-08-17 02:52:25 字數 3870 閱讀 3810

陣列和指標

首先我們說的是陣列,在定義陣列的時候我們要注意陣列的初始化和給陣列賦值,下面由具體的例項說明

/*//

一維陣列的定義

int main()

;//這是定義了乙個長度為10的陣列並且給該陣列初始化,即arr[0]一直到arr[9]的值分別為1,2,3,4,5,6,7,8,9,10

陣列,定義時10長度

.  *注意:如果定義了乙個長度為10的陣列那麼它的下表只能是從0—9,如果把陣列的下標寫成10就會造成越界.

arr[3] = 10;//使用時,下標3

以上兩種陣列的寫法看上去似乎一樣但實際上是有區別的

int arr[10]是在定義語句中,10代表的是陣列長度,但arr[3] = 10;這是在使用的時候,表示arr陣列的下表為3的那個值為10,即第四個資料的值為10

int brr[0] = 0;

int brr[10]; //

這個陣列的定義與

brr[0] = 0

的陣列形成了對比在int brr[10]陣列中從第乙個到第十個的值都是隨機值,而brr[0] = 0陣列中的所有值都是0;

int crr[10] = ;//

這是一種

聚合型別,它

只初始化一部分,剩餘部分為0

, 在面試中經常考

int err[5] = ;// 該陣列容易混淆,其實他的第乙個值為0,第二個值為1,其餘的值為0;

int drr[2] = ;

printf("%d\n",drr[0]/drr[1]);//錯誤

,因為只有drr[2]的值為1,其他的值都是0,如果這

樣除那麼分母就為0,這樣是沒有意義的。

//指標    

*注 在指標中我們要記住乙個概念指標 = 位址

int main()

int a = 10;

int b = 20;

int *p;   //定義了乙個整型指標變數,在這裡「*」說明了p不是乙個普通變數而是乙個整型指標變數

int *p = &a;// 這是定義了乙個整型位址的變數p,然後儲存了整型位址值位址值

*p = 100;  

//a = 100

這裡用到了解引用,p儲存了a的位址,所以*p是從p跳到了它

儲存了位址的那個變數上,p=&a(p儲存了a的位址),*p=100,所以a的     值就是100

p = &b;

*p = 200;

// b = 200

與a值同理

int **pp = &p;   

*pp = &a; 

//p = &a;

**pp = 1000;

//a = 1000;

這裡用到了兩個解引用,pp儲存了p的位址,p又儲存了a的地

址所以第一次解引用是從pp解引到p然後再從p解引到a,所以a的值為

1000;

*pp = &b;       //p = &b;

**pp = 2000;    //b = 2000;

與a值同理

* 一維陣列中陣列名在如下情況下表示兩個整個陣列;

1、在定義陣列的同乙個函式中sizeof(arr)

2、在定義陣列的同乙個函式中,&arr+1;

其他情況下陣列名arr表示陣列首元素的位址

*  指標在32為平台中所佔位元組數為4,在64位平台中所在位元組數字8,

下面以32位平台中所佔位元組數計算:

int arr[10];

sizeof(arr);  // 該值等於40位元組,因為此時的arr代表的是整個陣列

sizeof(arr[0]) // 改值等於4位元組,因為arr[0]只代表第零個元素

由以上可以得出 *  

陣列個數

= sizeof(arr) / sizeof(arr[0]);

但是在下面帶有這樣形參的函式中不能這樣計算陣列的長度

void show (int *arr)

sizeof(arr)   //  他的值位4,因為*arr表示的是指標,它在這裡只佔4個位元組;

sizeof(arr[0]) //  這是表示第零個元素,而陣列又是整型的,整型也佔4個位元組;、

sizeof(arr) /  sizeof(arr[0]) == 1// 所以它們相除結果為1

所以正確寫法如下:

void

show(

int*arr,

intlen) }

intmain()

; show(arr,

sizeof

(arr)/

sizeof

(arr[0]));

return

0; }

//二維陣列:在使用二維陣列時我們可以將其看成是特殊的一維陣列

//舉例說明:

intarr[3]

; int

brr[3][4];

(1)二維陣列在理解的時候我們可以與一維陣列模擬,先從他的陣列名開始說起,在以為陣列中arr它代表的時這個以為陣列首元素的位址,所以我們的二維陣列的陣列名就代表的是第一行元素的位址,在一維陣列中我們的還可以這樣寫*p,只不過在現在的二位陣列中的這個一維陣列*p他有4個值而已(二維陣列的第0行),所以我們可以將brr寫成是(*p)[4];為什麼要把*與p用括號括起來是因為陣列的標誌是,但是*的優先順序的低,所以加個括號。

(2)剛說了要把乙個二維陣列看成是特殊的以為陣列,所以我們現在可以把這個二維陣列分成三個一維陣列,即brr[0]代表的是這個二維陣列的第0行這個一維陣列,brr[0]是該陣列的陣列名,這個一維陣列中有4個元素,brr[1]代表的是第一行的這個陣列,brr[1]是該陣列的陣列名,該陣列中有四個元素,brr[2]代表的是第一行的這個陣列,brr[2]是該陣列的陣列名,該陣列中有四個元素,brr[0]、brr[1]、brr[1]還可以分別代表他們陣列的第乙個元素的位址,

(這個可以類似一維陣列arr,arr表示陣列首元素的位址)

brr+1 是指向了二維陣列的第一行的整行,因為brr和(*p)+4指向的是二維陣列的第0

行一整行,所以brr+2就指向了該二維陣列的第二行一整行;

(4)brr[1][1]是指brr[1]這個一維陣列中的第乙個元素的值;brr[1]+1是指brr[1]這個一維陣列第乙個元素的位址;

(5)int

(*p)[4]

在二維陣列中做形參列表中的形參使用。

//三、判斷陣列和指標的方法

確定它的屬性,根據優先順序確定

如果是指標的話,要看它指向的內容;如果是陣列的話考慮長度和陣列型別;如果是函式  

的話考慮引數列表和返回值;

intbrr[3][4];

int(*p)[4]

//三、判斷陣列和指標的方法

int(*p)[4]  //指標,根據優先順序,p是乙個指標,後面是乙個陣列,指標指向了陣列,他                  是乙個指向陣列的指標,所以簡稱他是陣列指標

int*p[4]   

//陣列,比*優先順序高,他的型別是整型,長度為4,他是儲存整型指標型別的陣列,簡稱指標陣列;

int(*p)()  //函式,指向乙個沒有形參,返回值為整形的函式,(指向函式的指標),簡稱數指標;

int*p()   

//函式,指向乙個沒有形參,返回值為整型指標類的函式;(返回指標的函式),          簡稱指標函式

陣列指標和指標陣列

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

陣列指標和指標陣列

一 定義 陣列指標 陣列指標 是指向陣列 首元素的位址的 指標,其本質為指標 這個指標存放的是陣列首位址的位址,相當於2級指標,這個指標不可移動 指標陣列 陣列元素為指標的陣列,其本質為陣列。二 舉例 int a 3 4 這個無需多說,就是乙個 二維陣列 int p 4 就相當於int p 4 它就...

陣列指標和指標陣列

這兩個名字不同當然所代表的意思也就不同。我剛開始看到這就嚇到了,主要是中文太博大精深了,整這樣的簡稱太專業了,把人都繞暈了。從英文解釋或中文全稱看就比較容易理解。指標陣列 array of pointers,即用於儲存指標的陣列,也就是陣列元素都是指標 陣列指標 a pointer to an ar...