在程式設計中我們經常會會用到陣列與指標,也都知道可以通過指標來訪問陣列,那這二者又有什麼區別呢?
我們來看下面的幾個**:
我們建立了乙個工程,將head.c和test.c 一起放入原始檔中,在head.c中建立指標變數char *p = 「abcdefg」,然後再在test.c中宣告它,再通過%s的形式將其輸出。這時螢幕上輸出了abcdefg的值。
我們對**做部分修改:
在這我們可以看到,在head.c中,我們定義的變數為字元指標變數,而在test.c中我們將它宣告為了字元陣列,這時,再對p以%s輸出,輸出的值為隨機值。那這是什麼原因呢?
我們再對它做研究:
我們知道,對於head.c中的指標變數p,對它的初始化,並不是將」abcdefg」的值存入了p中,而是常量字串中首元素『a』的位址儲存到了p中。對於test.c中宣告的陣列p來說,它是將head.c中的指標變數宣告為了陣列,由於它們是同一塊空間,所以它是將指標p的值,也就是『a』的位址,當成了值存到了陣列中,因此我們在這裡輸出的就是『a』的位址,我們可以對它做進一步的驗證。
我們將test.c中p陣列的每個元素以16進製制輸出,然後再重新定義乙個指標指向常量字串「abcdefg」(相同的常量字串在乙個程式中,只存在乙份,所以位址相同),由於此電腦儲存為小端儲存,因此將兩個輸出對比,我們可以看p中儲存的正是常量字串的首位址,也就是『a』的位址。**如下:
那如果我們已經將p指標宣告成了p陣列,我們怎麼保證它輸出的正確性呢?我們看下面的**:
以%s格式輸出,我們需要給到abcdefg的位址,而現在p陣列的值就是字串的位址,因此我們只需要一次將陣列的所有內容讀出即可,我們知道p(陣列名)的值也代表了首元素的位址,因此,我們將p強制型別轉換為char**,這樣p中的值就可以被以位址的形式一次全部訪問到,我們再對其解引用,就得到了a的位址,這時我們就可以得到想要得到的值,同時,這也印證了我們前面的分析。
那如果在head.c中將其定義為陣列,在test.c中將其宣告為指標呢?指標大小為4個位元組,所以我們將字串改為4個位元組(包括』/0』,所以為』abc』)。
用與前面一樣的分析方法,我們可以得出結論,當前p中儲存的並不是」abc」的位址而是」abc「的值。我們可以以16進製制輸出p,看到p的值具體是多少:
我們對其做以**:
現在,我們要以%s格式輸出「abc」,我們只需要拿到a的位址,就可以將其輸出,而p的值正是「abc」,所以這次我們要輸出的值為p,而不是p指向的空間的值,因此,我們只要拿到p的位址,將其強轉為char*型別,那麼以%s形式輸出就得到了我們需要的值。
以上就是我對陣列與指標定義以及宣告問題的個人理解,不足之處還望指正。
關於C語言的指標陣列與指標陣列的個人理解
一 指標陣列與指標陣列 1,指標陣列 顧名思義,即乙個元素全部是指標的陣列,其形式與普通陣列相似,形式如 a n 在理解指標陣列的使用方式前,我先來說下我個人對陣列的理解。比如一維整形陣列 形如int a 3 其實是乙個具有3個整形元素的變數 二維整形陣列 形如int a 4 3 可將其視為有a 4...
陣列指標與指標陣列區別
前提 陣列指標是指標 指標陣列是陣列 示例 int p1 5 和 int p1 5 前者為指標陣列 後者為陣列指標。涉及運算符號優先順序 陣列下標比取值運算子 的優先順序更高。自右向左結合。先結合陣列下標.先談指標陣列 int p1 5 指向整型資料的指標變數。0 1 2 3 4 int 結論 指標...
深入理解陣列指標與指標陣列的區別
陣列指標與指標陣列的區別在於 陣列指標p是乙個指標,而指標陣列p是乙個存放n個指標變數的陣列。一 陣列指標 int p n 重點 優先順序高 的優先順序是一樣的,但它們的方向是從左至右的,所以先執行括號裡的 p 首先說明p是乙個指標,指向乙個整型的一維陣列,這個一維陣列的長度是n,也可以說是p的步長...