C語言 指標和陣列的聯絡與區別

2021-10-10 14:39:10 字數 3437 閱讀 4814

陣列:陣列和指標的區別和聯絡:

指標首先是一種資料型別,使用它定義的變數稱為指標變數,指標變數是專門用來存放位址的。以int* a為例:a就是乙個指標變數,a變數存放乙個int型別資料的位址。a變數的大小根據編譯器使用32位方式編譯還是64位方式編譯分別對應4個位元組和8個位元組。

(1)指標 + / - 整數:

以int* a為例 a + 10,不是增加10個位元組,而是增加10個int型別變數的大小也就是 4 * 10 = 40個位元組。a - 10與加操作類似:減去40個位元組。 同理 a++ 和 a-- 操作分別是加上和減去4個位元組。

(2)指標 + / -指標:

指標 + 指標:沒有任何意義。

指標1 - 指標2:表示指標1 與 指標2之間相差多少個元素個數例如:

int arr=

;int

* pa1 =

&arr[0]

;int

* pa2 =

&arr[10]

;printf

("%d"

, pa1 - pa2)

;

輸出結果是 -10;

野指標,也就是指向不可用記憶體區域的指標。通常對這種指標進行操作的話,將會使程式發生不可預知的錯誤。

野指標的產生方式:

(1)未初始化:

指標變數沒有被初始化。任何指標變數剛被建立時不會自動成為null指標,它的預設值是隨機的。所以,指標變數在建立的同時應當被初始化,要麼將指標設定為null,要麼讓它指向合法的記憶體。

(2)指標越界訪問:

#include

intmain()

;int

*p = arr;

int i =0;

for(i=

0; i<=

11; i++

)return0;

}

(3)指標指向的空間釋放

指標p被free或者delete之後,沒有置為null,讓人誤以為p是個合法的指標。free 和 delete只是把指標所指的記憶體給釋放掉,但並沒有把指標本身乾掉。通常會用語句if (p != null)進行防錯處理。很遺憾,此時if語句起不到防錯作用,因為即便p不是null指標,它也不指向合法的記憶體塊。

陣列是一組相同型別元素的序列,底層空間連續。如果要將某個有限相同型別的序列命名,我們稱之為陣列名。例如:

int arr[10]

=;

陣列名為arr,陣列的型別是 int [10]。陣列元素型別是int。需要注意的是陣列名arr是不能改變的。也就是說不能進行++和–操作,陣列名只有在sizeof(arr) 和 & arr 的時候代表整個陣列,其他的時候會被降級處理成指向首元素的指標常量。

(1)一維陣列的傳參:

陣列傳參的時候永遠不會以值傳遞,假如傳遞陣列int arr[10],實參arr會被降級處理成指標常量。形參的形式如下:

void

test

(int

* arr)

;void

test

(int arr)

;void

test

(int arr[5]

);

上邊形參的幾種宣告方式都是完全等價的,因為在一維陣列傳參時,形參不會真實的建立陣列,雖然看上去是定義了int arr[5] ,但是實際上arr會降級處理成乙個指向首元素的指標,首元素的型別是int,所以相當於只是定義了乙個int* 的指標變數。例如下邊**:

void

test1

(int arr[5]

)int

main()

;test1

(arr)

;return0;

}

程式的輸出結果是4, 和乙個位址。說明函式並沒有建立int [5]型別的陣列,而且arr是可變的。

(2)二維陣列的傳參:

與一維陣列相同,形參並不會建立乙個二維陣列,就算是定義二維陣列,也會降級處理成乙個指向首元素的指標。二維陣列的首元素也是乙個陣列,所以形參的指標型別是乙個陣列指標。所以下邊這幾種二維陣列的宣告方式沒有區別:

void f(int **);

void f(int *arr);

void f(int *arr[5]);

//傳參正確

//表明二維陣列的大小,三行五列.

void

test1

(int arr[3]

[5])

//傳參不正確

//二維陣列的兩個方括號,不能全部為空,也不能第二個為空,只能第乙個為空

void

test

(int arr[

])//傳參正確

//可以寫成如下這樣傳參形式,但是不能寫int arr[3]

void

test

(int arr[

3],int rows)

//傳參不正確

//arr是一級指標,可以傳給二維陣列,但是不能正確讀取,

void

test

(int

*arr,

int irows,

int icols)

cout<} cout<}//傳參正確

//傳過去的是二維陣列的陣列名,即陣列首元素的位址,也就是第一行的位址,第一行也是個陣列,用乙個陣列指標接收

void

test

(int

(*arr)[5

],int rows)

//傳參不正確

//可以傳參,但是在讀取的時候會有級別不同的問題

void

test

(int

**arr)

intmain()

;test

(arr)

;}

指標陣列和陣列指標:

指標陣列是陣列,陣列裡邊存放的是指標變數。

陣列指標是指標,是指向陣列的指標。

那麼下邊的p1和p2分別是什麼?

int *p1[10];

int (p2)[10];

p1: 指標陣列 。 的優先順序高於 * 的優先順序 所以p先於結合說明他是乙個陣列然後再與 * 結合說明他是乙個存放 int 型別指標的陣列

p2: 陣列指標。p2和 * 被括號括起來,說明他首先是乙個指標,是指向int [10]型別的指標。然後int[10]是乙個陣列所以 p2是乙個陣列指標。

首先陣列和指標是兩個完全不同的資料型別。他們之間的聯絡在於陣列名的降級處理,也就是陣列名在大多數情況下會被當做乙個指向陣列首元素的常量指標來處理,比如在傳參,賦值,算數運算等操作的時候。例如 int arr[10] = ; arr + 1加四個位元組。並不是 40個位元組。

只有 sizeof(arr), 和 & arr 的時候 arr會被當做int [10] 型別的陣列來處理。

c語言指標和陣列的聯絡

二 指標與二維陣列 例題 懷著忐忑的心情寫了人生第一篇部落格.誠惶誠恐.主要內容 本篇部落格主要是較為詳細的解釋指標與一維 二維陣列的聯絡 1.一維陣列的儲存方式 2.對一維陣列名的理解 3.陣列下標和指標的關係 4.一位陣列名與取陣列首位址的區別int array 5 printf d d d a...

指標陣列和陣列指標的區別與聯絡 引用和指標(二)

目錄 指標陣列和陣列指標的區別與聯絡 指標陣列 陣列指標 先舉個例子 乙個有10個指標的陣列 int a 10 乙個指向有10個整型數字陣列的指標 int a 10 include include int main system pause return 0 執行如下 我之前一直在想陣列指標的應用場...

C語言 指標陣列和陣列指標的區別

目錄 一 指標陣列 二 陣列指標 指標陣列 指標陣列可以說成是 指標的陣列 由指標變數組成的陣列 實際是乙個指標 長度固定 32 位系統下佔 4 個位元組 指標指向陣列 指向的陣列佔多少個位元組不確定 首先這個變數是乙個陣列 其次,指標 修飾這個陣列,意思是說這個陣列的所有元素都是指標型別 在 32...