解析char p與char p 區別

2021-06-09 13:58:48 字數 1426 閱讀 1375

**: 

主要解析的問題:

問題1:

#include "stdio.h"

char *get_string_1()

char *get_string_2()

int main()

輸出:get_string_1:(亂碼或者沒有輸出),linux下沒有任何輸出

get_string_2:hello world!

為什麼會這樣?

問題2:

char *p = "hello world!";這樣寫到底合不合法,實際應用中能不能這樣寫。

問題3:

char *p = "hello world!";與char p="hello world!";有什麼細節和操作上

的差異。

解析:char *p = "hello world!";與char p = "hello world!"; 兩者都用

來宣告乙個字串,並將其初始化為hello world!,但是表示的意義確是大不相

同。從其宣告的物件來說:

char p = "hello world!";用來宣告乙個陣列p,陣列大小為12位元組。

char *p = "hello world!";用來宣告乙個指標p,指向「hello world!

」字串起始位置。

從儲存位置來說:

char p = "hello world!";p陣列作為區域性變數被儲存在棧區;

char *p = "hello world!"; 在這個宣告中,"hello world!"被儲存在

靜態資料區(有記述**段的,待定??) ,而且是全域性的,p僅僅就是個指標,指向這個區域。不信的話你可

第乙個問題也就不難解釋了,get_string_1()函式執行完就釋放了棧區記憶體,所

以根本就不存在存有"hello world!"宣告時的記憶體,也就不可能有所輸出。

那麼,寫成char *p = "hello world!";到底合不合法呢?能不能這樣

寫呢?這是乙個歷史問題,在const關鍵字被引入c語言之前,這樣寫是合法的

,而且存在了很長的一段時間,大量的**在此期間運用了這種寫法,新版c語

言為了相容,故允許這樣寫,但最好不要這樣,因為這種寫法終會被淘汰,說不

定哪天你的**用了新版的編譯器,然後莫名的出了問題,要找這個bug估計不

是一件容易的事。現在最好寫成:

const char *p = "hello world!";

或者char p = "hello world!";

那他們在操作和細節上有什麼區別呢?

區別很多,由於本人才疏學淺,只總結出以下幾點,忘有知者補充:

1. char *p = "hello world!"; 可以用p++操作,sizeof(p) == 4;

2.char p="hello world!"; sizeof(p) == 12;

解析char p與char p 區別

主要解析的問題 問題1 include stdio.h char get string 1 char get string 2 int main 輸出 get string 1 亂碼或者沒有輸出 linux下沒有任何輸出 get string 2 hello world 為什麼會這樣?問題2 cha...

char p 和 char p 區別及應用

p的含義是指向常量字元的指標 char p hello 等價於const char p hello 常量字元 說明hello這個字串是無法改變的,則不能更改指標指向的內容,來改變字串hello。p 2 w 錯誤 指向的指標 是可以改變自身的值,輸出p的時候就不是hello了而是別的字串 p news...

char p和char p 的問題

這個問題,平常也經常碰到,今天寫程式的時候又遇到,還是應該總結一下。先貼 1 include 2 char mystrcpy char dest,const char src 3 9 char temp dest 10 while src 0 11 16 temp 0 17 return dest ...