C語言指標 字串 記憶體

2021-07-24 07:37:22 字數 1050 閱讀 3845

char p = "hello world";    -稱為a定義方式

char * p = "hello world";    -稱為b定義方式

兩個p的區別

分兩種情況:

1 這個p是全域性變數(通俗點就是在函式外面定義的)

那麼這兩種方式, 產生的效果有點相同的地方:

a:使用a定義方式, 只分配了  sizeof(p) ==  sizeof("hello world") == 12 位元組的記憶體

(字串長度為11, 加上乙個位元組的結束符號)

p是這段記憶體的開始位址, 他不是實際的指標變數,所以   p = p+1;  這類的操作,連編譯都通過不了。

b:使用b定義方式,字串分配了 sizeof("hello world") == 12

的記憶體,除了這之外還分配了sizeof(p) == sizeof(void *) 的記憶體(乙個指標的記憶體一般是4或8位元組)

p是乙個指標, 它存的值是這個字串的開始位址。 所以    p++; p = "****";   這類的操作都是合法的。

但是如果b方式沒有修改p指標的指向,這兩種方式使用p都能夠獲取到字串"hello world", 產生是一樣的錯覺,其實差別很大。

但是有一點是相同的:  相同的字串 "hello world" 會存放在全域性變數存放的地方。

2這個p是區域性變數(通俗點就是在函式內部定義的)

那麼這兩種方式, 產生的效果就會有很大的不同:

a:使用a定義方式, 只在stack(棧)中分配了12位元組的記憶體

p是這段記憶體的開始位址, 他不是實際的指標變數,所以   p = p+1;  這類的操作,連編譯都通過不了。

而且只能在函式內部使用p,函式返回後,p這塊記憶體值就是非法的了

b:使用b定義方式,也是在全域性變數區分配了 sizeof("hello world") == 12的記憶體,

除了這之外還在stack(棧)中分配了乙個指標的記憶體

p是乙個指標, 它存的值是這個字串的開始位址。 所以    p++; p = "****";   這類的操作都是合法的。

但是只能在函式內部使用p

C語言 字串 指標

字串 1.字串 jack j a c k 0 用陣列儲存字串 char name 10 jack printf name 2.字串的一些定義 都是字串 0的ascii碼值是0 char name 8 it char name2 8 char name3 8 0的ask碼是0 char name4 8...

C語言 字串指標(指向字串的指標)

字串一旦被建立就存在於常量池中。以字元陣列形式建立的字串,實際上是從字串常量池中複製了乙個副本,所以修改字元陣列的內容時,只是修改的自己的副本,並不會影響到常量池中的字串。而對字串指標strp操作時會影響到常量池中的字串 char strc string char strp string print...

C語言指標 字串和指標

字元指標可以指向字元變數,但在實際應用中,我們常常會用到字串,而字串也是可以用字元指標指向的,但根據字串的不同儲存方式主要分為字串常量和利用字元陣列儲存的字串變數,兩者有不同的定義和使用形式 字元指標可以用來儲存字串常量的首位址 例如 char ptr my name is 此時,字串常量在記憶體中...