C語言學習筆記之陣列與指標的關係

2022-09-07 12:00:15 字數 2362 閱讀 1411

首先,大家先需知道乙個關於基型別的概念

基型別:組成乙個新型別的基礎型別

這句話是什麼意思呢?舉個例子:

int a[3] = ;

上面是由三個int型別的數組成乙個新的型別也就是陣列,所以基型別是int

int a[2][2] = ,};

上面是由兩個一維陣列型別組成乙個二維陣列,所以基型別是一維陣列

有了上面兩個例子,相信大家能知道基型別是啥意思。

接下來先說說一維陣列和一級指標關係

首先指標說白了就是存放位址,把變數位址賦予指標

取出該變數的數值應該用*號取出指標所指變數位址裡面的值,如下

如果我們想把乙個陣列的位址賦值給指標,如下

程式裡的a表達的是陣列的首位址,則我們可以得到int *p = a的關係

如果我們想輸出陣列第二個元素的位址呢,是不是得把指向首位址的指標移到陣列第二個數的位址

指標p儲存首位址,也就是指向陣列的第乙個元素,+1後相當於指向陣列第二個元素,指標往右移動1個基型別,也就是乙個int型長度,所以位址與首位址相差4個位元組,因為int資料型別長度為4個位元組。

我們用 * 號取後數值為1,說明正是指向陣列第二個元素。

突發奇想,指標 p = a,那我可以把p改作a執行上面操作嗎?

想法被確定了,在某種情況下,陣列的確和指標用法一樣。

接下來是二維陣列和陣列指標關係

陣列指標:本質是個指標, 指向 陣列的指標

有人可能會問,那可以指向一維陣列嗎,先不說,看到下面應該就能理解

可以看出,p存放二維陣列首位址,如果我們想要到a[1][0]的位址呢

指標p儲存首位址,上面我們已經說過二維陣列由一維陣列構成,基型別為一維陣列,+1後相當於指向二維陣列第二個元素也就是第二個一維陣列,指標往右移動1個基型別,也就是乙個一維陣列型長度(包含兩個int型),所以位址與首位址相差8個位元組。

如果想要a[1][0]的數值呢

有人可能會被不知道為什麼需要兩個 * 號才能取出數值

這是因為我們一開始時p+1只是指標移動乙個基型別,也就是移到二維陣列的第二個一維陣列一整個中,可是別忘記他的元素是一維陣列,沒有*之前我們還只是在二維陣列中,我們 *才是進入一維陣列裡面,然後接下來就和一級指標一樣的操作,再多個*就可以把數值取出:*(*(p+1))

如果要取a[1][1]的位址和值呢

為什麼在第乙個 * 號後+1呢

因為當我們*(p+1)進入二維陣列中第二個一維陣列裡面後,我們如果想取它一維陣列第二個元素的int值,是不是和上面一維陣列和一級指標一樣,+1就可移動到第二個int,這裡(*p+1)+1後面+1移動的是int的基型別,前面的+1移動的是一維陣列的基型別,則取出a[1][1] 則需要(*(*p+1)+1) 。

看到這裡希望大家明白為什麼前面說的陣列指標不能指向一維陣列以及二維陣列和陣列指標關係

總結:一維陣列和一級指標:

int a[5];

int *p = a;

二維陣列和陣列指標的關係:

int a[2][2];

int (*p)[2];    注意陣列指標和二維陣列後面的[2]必須相同。

C語言學習筆記 指標 指標陣列與陣列指標

指標陣列 是乙個陣列,陣列元素為指標 陣列指標 是乙個指標,指向陣列的指標 例如 int p1 5 int p2 5 對於語句int p1 5 因為 的優先順序要比 要高,所以 p1 先與 結合,構成乙個陣列的定義,陣列名為 p1,而 int 修飾的是陣列的內容,即陣列的每個元素。也就是說,該陣列包...

C語言學習筆記 指標與陣列

在c語言中,陣列與指標的關係非常密切,陣列下標所能完成的任何運算都可以用指標來實現 一般而言,指標運算比陣列下標運算的速度快,但用指標實現的程式理解起來稍微有一些難度 一 指標與一維陣列 int a 10 定義了乙個大小為10的整型陣列a int pa a 0 將指標pa指向陣列a的第0個元素,即p...

C語言學習筆記之函式指標與函式指標陣列

指標函式 本質是乙個函式 是乙個返回指標型別的函式 int sum 函式指標 本質是乙個指標 是乙個指向函式的指標 int p int,int sum p 5,6 int sum int a,int b 指標陣列 陣列內儲存的都是指標 int p 2 int a 20 int arr 5 int p...