總有人認為陣列和指標是c語言裡面最難的部分,其實認真思考發現陣列和指標內容不多,只是我們經常把很多知識ran在一起,搞得自己很混亂。接下來我們細細看一看。
一、陣列(陣列:相同型別的元素的集合)
1、一維陣列
(1)陣列名及意義
1)陣列名
看兩個表示式的宣告 int a; int b[5]; a是個變數名也是乙個變數,b稱為陣列名,他是個指標常量,他的型別和陣列元素型別相同,他的值是第乙個元素的值。
陣列名是個常量故此,不要試圖去修改b的位址,因為陣列的位址在程式鏈結是已經分配好了固定的位址,程式執行時已經無法修改。
陣列名只有兩種情況不被看做常量,sizeof(b)此時求得整個陣列的整體長度(占用的總位元組數)不能認為是求得指標常量的長度;&b此時求得整個陣列的位址而不是指向某個常量的位址。
2)下標引用
b[2];他表示取得陣列的第二個元素。過程描述:先對b指標加2(指標後移兩個元素),再解引用(取出該位址處的內容)相當於*(b+2)。
下標訪問過程和指標表示式訪問過程相同,所以在任何時候你可以選擇下表訪問和指標訪問(指標訪問效率高)。
下面來幾個栗子看看怎樣轉換:
3)陣列名作為函式引數
int b[10];
void fun(int *b),此時的b指標和原來的陣列名b指標是不同的兩個指標,此時的b是陣列名b的乙份拷貝。所以我們在函式內部試圖對b進行修改並不會影響陣列名b指標,但是我們可以通過解引用去訪問陣列,並去操控他。
舉兩個例子:
將src字串拷貝到str中。
char *capacity(char *str) //此題就是典型的陣列名傳參試圖操縱形參來改變實參的問題,本題原意是去給陣列str開闢記憶體,並將src的內容拷貝給str,記憶體的確開闢了但是完全和str沒關係,下面進行拷貝字串時程式崩潰。給str開闢記憶體
return
str;
}int
main()
}
再看下面的操作。
void strcpy(char *dst,char此時並沒有去直接操作引數,而是去訪問裡面的內容。const*str)
}
這兩個栗子同時也說明函式傳參是把實參進行了乙份臨時拷貝。
宣告陣列引數:
int fun(int *str) & int fun(int str),你可以使用兩種任意一種,我在部落格你看到這種情況int fun(int *str),這個是錯誤的宣告。
陣列在進行傳參還應該注意盡量不要傳整個陣列,而是用陣列名(指標)作為實參傳遞,這樣可以提高效率,節省記憶體。
4)陣列的儲存
陣列元素在記憶體中從位址到高位址順序儲存。
2、多維陣列(可以看做是一維陣列的各元素裡面放著(n-1)維陣列,簡單的說就是一維陣列裡面放著陣列)。
故多維陣列的使用與一維陣列相同。不同之處在於陣列名傳參,舉個例子:
int arr[4]
[4];
fun(arr);他的原型可以是如下兩種:
void fun(int arr); 或者 void fun(int (*arr));
切記不能是這樣 void fun(int **arr);
3、指標陣列
int *arr[5]; 這就是指標陣列的定義。他和其他陣列相同只是陣列元素的型別變為了指標。
二、指標談到指標大家總會覺得很是琢磨不透,難。下面我們來慢慢了解。
1、指標是什麼?
在電腦科學中,指標(pointer)是程式語言中的乙個物件,利用位址,它的值直接指向(points to)存在電腦儲存器中另乙個地方的值。由於通過位址能找到所需的變數單元,可以說,位址指向該變數單元。因此,將位址形象化的稱為「指標」。意思是通過它能找到以它為位址的記憶體單元。
我們可以這樣理解,先看個圖
對應**:
#include int總結:指標就是變數,用來存放位址的變數。(存放在指標中的值都被當成位址處main()
理)。2、指標變數
像定義其他變數一樣,比如int *a;char *c; float *c; 這些就是指標變數。(是不是還是很簡單的)
3、指標的解引用
int *a;int *b; *a = 10;對變數a解引用就是對a所指向位址處的空間進行操作,此時就把a所指向的位址處存入了整數10。 *b = *a; 此時就是把b所指向的位址處存放了a所指向位址處的內容(此處存放整數10)。
4、指標的運算
指標可以進行算術加減運算和關係運算。
算術運算:
int a[5]=;
int *b;
那你知道a+1;表示什麼呢?上面陣列問題談到過,陣列名在表達中代表指標,此時就是對指標加一。看下面
所以我們很清楚的看到,對指標加一,其實不是加一,而是加了該指標所對應的型別的位元組數乘以1。減法運算與此相同(注意運算結果是不是你想要的結果,注意陣列越界)。
關係運算:
關係運算就是可以對指標進行 比較大小 例如:
int *a,*b;*a=1可以進行 >,=,<= 這些運算。; *b=2
;if(a>b)
printf(
"hehe");
else
printf(
"haha
");
5、指標陣列
指標陣列和其他陣列一樣,只是陣列裡面存放的元素變為了指標。看下面
很清楚的看到指標陣列的陣列元素都是指標,此時指標指向字串第乙個字元對應的位址。
6、陣列指標
陣列指標,顧名思義他是個指標,他指向某個陣列。
int a[4]
[5];
int (*p)[5]=a;
這裡a是個二維陣列的陣列名,相當於乙個二級指標常量;p是乙個指標變數,它指向包含5個int元素的一維陣列。看下面的 你會更清楚理解。
三、陣列和指標之間的關係
陣列可以用指標訪問,陣列裡面可以存放指標,陣列可以作為指標的指向物件;指標可以訪問陣列,指標可以存放陣列的位址。
有人說陣列和指標之間有著千絲萬縷的關係,有人說陣列和指標沒關係。那麼你認為呢?
如果你經常搞混指標和陣列,以及掌握的不牢固,建議多寫程式去除錯,看記憶體變化,如果你能看懂彙編**,你不妨轉到彙編去看看(可能會豁然開朗)。
指標那些事(算術運算 和陣列的關係)
指標算術運算有三種 指標加數字 指標減數字 指標減指標。指標加減數字 指標加減法需要調整指標,調整的權重是指標本身清楚乙個 號,在求sizeof 的長度。eg int main 指標減指標合法 指標加指標不合法 a,算出兩個指標間隔的位元組數,b,除以調整的權重,調整的權重是指標本身去掉乙個 號,再...
指標陣列和陣列指標
有關陣列指標和指標陣列容易混淆,本文舉例說明兩者的區別,並加以分析。基本概念 指標 inta 1 int p a 指標的指標 int p2p p 簡單陣列 intb 20 指標陣列 int p 10 指標陣列,含有10個指標元素,即每乙個元素都是乙個指標 陣列指標 int p 10 這個指標用來指向...
指標陣列和陣列指標
理解這兩個概念,當從語言學的語法角度開始,定語 名詞,即 的 語句。指標陣列 指標的陣列 陣列指標 陣列的指標。一 指標陣列 元素為指標的陣列 顧名思義,就是說的首先是乙個陣列吧,然後陣列的元素是指標而已。說明形式為 type pointer array constant1 constant2 co...