數組指針和指針數組的區別

中國的文字博大精深,不仔細研讀,很容易理解錯誤,就拿這個數組指針和指針數組來說吧,剛開始接觸很容易弄混
那麼到底什麼是數組指針?什麼是指針數組?他們之間又有什麼區別?
指針數組: 數組裏的每一個元素都爲指針的數組,本質爲數組,只不過數組裏的元素爲指針罷了,至於是什麼類型的指針,那要視情況而論
數組指針:指向數組的指針,本質爲指針,只不過這個指針指向了數組而已
下來我們來看看在代碼中我們如何定義以及使用指針數組和數組指針
我們下來看指針數組
看一個例子:int * a[3]; 這句話的意思是:定義一個指針數組,這個數組裏有三個元素,這三個元素的類型是int * 類型所以說我們可以把 int 類型的 變量的地址賦給這個指針數組,我們來看一個實例:

#include <stdio.h>
int main
{
    int a = 1,b = 2;//定義兩個int 類型的變量
    int *p[2];//定義一個指針數組,裏面可以存放int 類型變量的地址
    p[0] = &a;//把 a 的地址賦給p[0],p[0]指向 a
    p[1] = &b;
    printf("%d %d\n",*p[0],*p[1]);//p[0]裏存的是a變量的地址,所  以*p[0]就是a
    return 0;
}

輸出結構是
1 2
下來我們來看數組指針
首先我們看一下數組指針怎麼定義:int (*p)[3]; 這樣我們就定義了一個數組指針,我們來剖析一下這個的含義,首先()的優先級高,所以首先p 和*結合,說明 p是一個指針,然後int 和[3]都是修飾這個指針的,意思是,這個指針指向了一個裏面有3個int型元素的數組
我們來看這麼一個例子:

#include <stdio.h>
int main(void)
{
    int a[3] = {1,2,3};
    int (*p)[3] = &a;
    printf("%p  %p  %d  %d\n",p,*p,**p,*p[0]);
    return 0;
}

大家思考一下,輸出結果是什麼?
結果是:
0018FF3C
0018FF3C
1
1
爲什麼p和*p的值一樣?爲什麼**p的值和*p[0]的值一樣?下面我們來分析分析
前面我們已經說過,p是一個指向數組的指針,(這裏的p只不過是指針變量的名字,說p指向一個數組,其實就是p變量保存了數組的首地址)
那麼,在上面的例子中我們把 a 數組的地址給了這個指針變量(注意:&a取得是整個數組的地址)所以p指向了這個數組,p的值是數組首字節的地址
這裏要注意的是*p的類型是int * 類型,爲甚麼呢?不是 *p應該是這個數組嗎?這是因爲在C語言中規定,數組“本身”出現在非 在非sizeof,非 & 後面時,會自動轉換爲指向數組首元素的指針,也就是說,這裏的*p轉化爲數組首元素的指針了(這個指針的值爲第一個首元素第一個字節的地址,映射的是四個字節)
在這個數組中的首元素的類型是int ,所以*p的類型就爲int * 了,所以 *p的值就和p的值相等了,**p的值就爲第一個元素的值 1 了,而*p[0]則因爲[]的優先級高,所以 p[0]就是數組首元素的地址,*p[0]就爲數組首元素了
結果也就不難理解了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章