C語言字元指標(字串)為什麼不可以直接像陣列那樣賦值?

時間 2021-05-11 03:09:04

1樓:check-777

直接定義乙個指標陣列不就行了,char *a[3]=;

2樓:tika64208

這個問題好理解,

char str申請的是陣列,char*p 申請的是乙個指標。

而是什麼,是乙個具體的值,或者說3個具體的值,在編譯的時候就已經知道的值。

你申請了4個元素的陣列,說裡面要存3個指定的值,叫分別是'a','b','c',編譯器能懂吧。

但是申請乙個指標變數,說你給我存'a','b','c'。指標變數本來是用來存位址的,結果你給3個字元,

然後編譯器就會:

但是實際上,編譯也能過對不對?

因為這種宣告,會有個常量區,在「連線」的過程中預留位置寫好了「abc」,這個資料在程式被載入的時候已經存在了,並且是不可修改的記憶體塊,可讀不可寫。指標變數p實際上指向的是這個位置。

所以「C語言字元指標(字串)為什麼不可以直接像陣列那樣賦值?」這裡是可以「賦值」,只是賦值的內容不一樣:陣列是賦的值是三個字元(沒有'\n',所以str[3]未知),變數賦的值是記憶體位址。

3樓:reid liu

char str[4] = ;

字面量 可初始化成功,是str[4]已在記憶體分配空間,程式只初始化即可。

char *p = str;

申明為字元指標,賦值字元指標,變數型別一致,沒毛病。

char *p = ;

為什麼不可以,簡單來說是變數型別不一致。

此寫法也沒觸發隱含的記憶體分配,這樣乙個是字元指標變數,另乙個是字面量,是行不通的。

PS:如果編譯器增加乙個規則,說不定就可以了。

4樓:

因為在char *p = ;中 p 並未分配合法的可用空間,指向未知的是記憶體區域。而對未初始化指標賦值這種操作屬於非法寫記憶體,會出現sf。

正確的做法是先分配空間

char *p = (char*)malloc(sizeof(char) * 4);

後賦值。

而第一種方式中,對於char*p = st;

等價於char *p;

p = str;

更明顯一點:

char *p;

p = &str[0];

到這裡就很明了了,一般來說,對於陣列str[N],直接對str引用表示&str[0],即取str[N]的第乙個(首)元素位址。因為陣列在宣告時系統就為之分配了記憶體空間(某種意義上,陣列其實是指標的語法糖),因此p = &str[0]相當於建立了陣列str乙個新的引用(注意是建立引用,不是複製,操作*(p+n)和操作str[n]效果相同),且不是不可用的未知區域,所以合法。

5樓:陳慎超

char str[4] 是乙個陣列,可以存4個char。

char *p 是乙個指標,可以存乙個char指標。

是個字面量,字面量只在編譯階段用來給變數初始化。不能取位址,所以不能把指標指向乙個字面量。

所以陣列str被初始化了,而p取不了字面量的位址。

str這麼寫本質是陣列,只是C會在用到str時自動取它的位址。

6樓:暮無井見鈴

注意初始化和賦值是不同的。

這東西不是表示式,沒有型別,只能用來初始化陣列或結構體。

而陣列可以隱式轉換成指向其首元素的指標右值,該值能初始化或複製給指標物件。

另外 C 字串指的是以零值字元結尾的連續字元物件序列,並不是字元指標,只是可以通過字元指標處理字串。

C 語言可以寫 char *p = (char); 。也可以用在賦值裡。

右邊的東西是復合字面量,是左值。生存期為當前塊(函式內部)或整個程式執行期(函式外部)。這段宣告的作用是建立乙個無名陣列,再由它隱式轉換出來的指標值初始化指標物件 p ,和題目上的寫法相比少宣告了乙個識別符號。

7樓:香草天堂

花括號初始化,可用在陣列初始化中,可用在含有對應字段(三個char欄位)的簡單結構體初始化中,或者當成initilizer_list物件,可匹配initilizer_list型別引數的類建構函式中。就是沒有初始化指標的。

const char* p = 「abcd」; 可直接初始化字串

8樓:

因為語句 char* p = str; 的實質是將字元陣列(左值) str[4] 的第乙個元素的位址取出來,然後存在字元指標型別的變數p裡。

也就是說,能存在p中的值只能是字元指標型別的值。而無法轉換成乙個字元指標型別的值,所以報錯。

C語言字串長度函式?

C語言答疑課堂 題主的問題有兩個地方需要回答 1.為什麼寫 c 100 會報錯?你看啊,陣列c定義的時候指定大小是100,這可不是意味著從1 100,而是0 99,C語言數字下標是從0開始的。對於我們來說,是不是有點不習慣?c 100 意味著第101個元素,這個元素並不在陣列裡,鬼才知道你是個什麼東...

C語言中,字串常量為什麼只能給字元陣列初始化,而不能通過指標賦值

程佳 陣列是指標常量,常量不能賦值。字串在c語言裡不是原生資料型別,就是乙個內容非0結尾為0的位元組陣列。所以對字串的操作要使用string.h裡那些庫函式。 神念的經 想啥呢,一旦定義成了靜態陣列,首元素位址就是定死的。想改位址?門都沒有。指標賦值?那是改指向的位址,不是改指向的內容。strcpy...

c語言怎麼從字串中提取自己想要的字元?

如果僅限英文本母數字等鍵盤上打的出的符號,那問題在於 你想要 的字元是啥,怎麼定義想要 滿足什麼條件 條件複雜可能還要用到正規表示式,甚至自己寫parser 坑是無窮無盡的,一切取決於你想要啥 如果包含中文等等世界各國語言的字元,還需要去學習 字元編碼 utf 8 gbk utf 16le utf ...