char指標與char陣列的區別(非常詳細!)

2021-06-19 00:05:51 字數 1301 閱讀 6643

首先看指標:

char *p = 「helloworld」;

在這裡p是乙個變數,其型別為指標型別,並且指向乙個字串,字串內容為」helloworld」,如果要訪問p[2]的話,就需要先從p中取出位址,該位址為」helloworld」的首位址,然後再加上偏移量2,就得到了』l』這個字元,所以其訪問的方式為先從p中取出位址,然後再將該位址加上偏移量,得到乙個位址,最後從這個位址中取出值來。其分為三步:

1.取p的值,該值即為字串的首位址;

2.該位址加上偏移量,得到所要取的字元的位址;

3.從這個位址中取得值。

此處p是乙個變數,它自己是存放在乙個位址中的,而它的內容則是」helloworld」這個字串的位址. p與字串是分開的。

同時,該指標的值是動態確定的,必須在執行的時候才能確定其值,並通過該值訪問到字串。

而如果是陣列的話,則為

char p[20] = 「helloworld」;

在這裡p為乙個字串的標識,其型別是乙個字元陣列的型別,且該陣列有20個char型別的大小.此時如果要訪問p[2]的話,分2步:

1.直接使用該字元陣列的首位址加上2個char型別的大小的長度就得到了要訪問的字元的位址;

2.最後再從這個位址中取出值來.而且此時p的位址為該字元陣列的首位址,其內容為』h』,乙個字元型別。

所以在這個地方陣列與指標是不相同的,因為此時陣列取值的第一步並不是從p中讀取位址來再加上偏移量的.此時的p這個位址的值就為』h』這個字元,其型別為字元型而不是乙個指標型別.此時p的位址與p[0]的位址是相同的。

同時,每個符號的位址在編譯時就確定了,所以這裡p的位址就已經確定了,如果需要訪問p[2],則直接使用該位址加上2這個偏移量就可以取到這個值了.它不需要指令再取得這個首位址.而第一種情況下,還需要指令取得指標中的值,並通過這個值來訪問字串。

乙個直觀的看法就是前一種是兩個不同的, 而後一種則是在同乙個裡面。

另外,還有乙個不同之處在於第乙個情況下 p 指向的是乙個常量區, 是不能改變的, 即不能夠對p[i]賦值, 而第二種情況下, p是乙個字元陣列, 其是可以改變的,可以對p[i]賦值的。

他們倆*p的值是一樣的,都是h字元!

char陣列與char指標

1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...

char陣列與char指標

char陣列與char指標 1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他...

char陣列與char指標

1 以字串形式出現的,編譯器會在結尾自動新增 0,思考,為什麼?存在的c語言方法,如strlen s 計算字串的長度,其中s指標。strlen要計算字串長度,必須知道 是結尾,因此使用 0表示結尾。只有字元陣列才有 0的概念,其它型別 int 的陣列沒有這個概念。因為其他型別的陣列或者指標,沒有st...