深入理解字串指標和字串陣列

2021-07-12 05:07:11 字數 943 閱讀 3439

首先我們來看一段程式:

#include int main()

它的輸出結果如圖:

分析:我們首先宣告了乙個字串陣列和乙個字串指標。然後將他們等同型別的輸出做對比。

從輸出結果我們可以看到,想要輸出整個字串。分別以%s格式輸出str和ps即可。

1.字串指標名ps和陣列名str都存放著字串的首位址。而字串本身存放在以該首位址為首的一塊連續的記憶體空間中,並以 '\0' 作為串的結束。

2.對str和ps分別取位址,以%s格式輸出。

&str:  輸出的結果仍然是字串。

&ps:  輸出的結果為亂碼。

那麼,這是什麼原因呢?

實際上,對於字串陣列,str和&str都一樣,都是字串陣列str的首位址。但型別不一樣,乙個是指向char的指標,乙個是指向整個陣列的指標。但是對他們分別+1效果就不一樣了,乙個偏移sizeof(char),乙個偏移sizeof(char)*11(也就是整個陣列的大小)。所以字串陣列可以理解為存在「雙層位址」,但是這兩個位址值都是一樣的,都指向字串首位址。

而對於字串指標,ps和&ps相去甚遠了。ps是整個字串的首位址,由於並不存在類似陣列的"雙層位址「結構,所以ps已經是指向字串最底層最基本的位址了,不具有陣列名這一位址,只具有「單層位址」,所以對它進行&操作,然後以%s格式輸出,這是不合法的,將乙個位址以%s輸出只能得到亂碼。

3.如上圖:對於字串陣列,我們加入了乙個指標變數p,使它指向str,然後進行&p(相當於&&str)操作,以%s格式輸出,結果才出現亂碼。而對於字串指標,只以%s格式輸出&ps操作結果就顯示亂碼。我們將&&str和&ps分別以%p格式列印出來,輸出結果顯示為正常位址。證實了我們的「雙層位址」和「單層位址」一說。

深入理解字串

1 字串處理 5 n 9 string str helloworld str str.substring 5,10 即可求出world object equals 比較記憶體位址 string equals 比較內容 1.暫存器 2.棧3.堆 4.靜態儲存區 5.常量儲存區 宣告final stat...

字串,字串陣列,字串指標!!

字串 字元陣列實際上是一系列字元的集合,也就是 字串 string 字串陣列 在c語言中,沒有專門的字串變數,沒有string型別,通常就用乙個字元陣列來存放乙個字串。c語言規定,可以將字串直接賦值給字元陣列 在c語言中,字串總是以 0 作為串的結束符。上面的兩個字串,編譯器已經在末尾自動新增了 0...

PHP核心分析之深入理解字串(七)

struct zend string zend refcounted h對應的結構體 typedef struct zend refcounted h v uint32 t type info u zend refcounted h 下面我們來了解一下具體每個成員的作用 static zend al...