指標和陣列的那點事

2022-05-09 09:36:12 字數 3607 閱讀 8014

總有人認為陣列和指標是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開闢記憶體

return

str;

}int

main()

}

此題就是典型的陣列名傳參試圖操縱形參來改變實參的問題,本題原意是去給陣列str開闢記憶體,並將src的內容拷貝給str,記憶體的確開闢了但是完全和str沒關係,下面進行拷貝字串時程式崩潰。

再看下面的操作。

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...