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 = "shit"; 這類的操作都是合法的。
但是如果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 = "shit"; 這類的操作都是合法的。
但是只能在函數內部使用p