陣列和指標
首先我們說的是陣列,在定義陣列的時候我們要注意陣列的初始化和給陣列賦值,下面由具體的例項說明
/*//
一維陣列的定義
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...