c 問題,char p abc 為什麼可以進行,abc是字串常量,p是非常量地址,為什麼可

2022-03-10 17:54:32 字數 4826 閱讀 4709

1樓:匿名使用者

c++的話,現在已經不可以了。但是要讓編譯器服從新規定,需要的工作不小。比如說gcc編譯器雖然現在已經可以對 char*p="abc"; 報錯,但是在比較微妙的地方還是沒有處理好

以前(上個世紀)c++確實是允許 char*p="abc"; 這樣的寫法的,理由是歷史原因:

· 最早的

c 語言實際上允許修改字串字面量,在那個時候(上個世紀七八十年代) char*p="abc"; p[2] = 's'; 是允許的。當時也沒有

const 關鍵字:const 關鍵字是 c++ 引入的,後來又被c語言吸收。這樣一來 "abc" 這樣的字串字面量的型別是 char[4]

,它可以隱式轉換為 char* 型別——這樣的話就沒辦法禁止寫 char*p="abc"; 。

· 之後 c++ 引入了 const,之後 ansi c 吸收了 const 這一關鍵字, ansi c 也禁止了修改字串字面量。但是不可能讓使用者在一瞬間立即放棄過去的所有**,所以暫時沒有改變字串字面量的型別,"abc" 這個字串字面量的型別還是 char [4]

· 當時 c++ 大概是照抄了 c 語言的規定,認為 "abc" 這樣的字串字面量的型別還是 char [4]

· 在 1996 年(這個能說出準確年份,因為在 c++ 標準委員會的官方**上還能找到提案),有人向標準委員會提議改變字串字面量的型別,從 char 陣列(array of char)變為 const char 陣列(array of const char),當時的過程外人自然無法瞭解,但結果是在c++國際標準 iso/iec 14882:1998 (這個版本的標準俗稱 c++98)裡面,字串字面量的型別確實是 array of const char。但是為了相容以前的**, c++98 還規定字串字面量可以隱式轉換到 char* 型別,並且 c++98 還表示,這個轉換是廢棄的(deprecated),說不定下一版標準就不能用了——嗯,這個轉換就是特例

之後,c++國際標準 iso/iec 14882:2011 就刪掉了這個隱式轉換

所以現在 char* p = "abc"; 應該是不合法的

2樓:喵不語

」abc」返回的就是字串abc在記憶體中的地址,指標p儲存地址沒問題啊!

3樓:匿名使用者

對,他說的對,我也是這麼想的

char *p; p="abc"; p不該是個地址麼,為什麼是字串常量? 而且書上解釋它記錄第一

4樓:匿名使用者

字串常量的定義有兩種方法,一種是字元陣列方式 ,一種是字串指標方式。前者就不用說了,後者就是用p來表示這個字串的首地址,你說了字元地址沒有明確,這不是你能作用的範疇,編譯器會自動分配地址

5樓:喵0個咪

p是指標變數,存的是地址型別的值(ps:包括了值型別,這個你可以先不管),然後說記錄第一個字元地址,其實是要對應陣列的,就像a[3]裡面有:a[0];a[1];a[2];三個變數,每個變數都可以附一個值,然後其實指標變數p=a[3]的時候,就是把a[3]的第一個a[0]的值的記憶體地址記錄了下來。

而你的p="abc",實際上是把字串"abc"的記憶體地址放進了p。而*p指向的是字串"abc"的首字元a,*p+1指向第二個字元b,如此類推。"abc"是一串連續的字串,系統會預設給它們分配連續的記憶體地址,你可以試試看這樣:

#include

main()

這個是我c語言的理解,好久沒看過書了,不過意思應該就是這樣了,有錯誤的話,幫我糾正吧,別罵,我也是學了不久的。

c語言給字串賦值的時候 char *p;p="abc"; char p[5]; p="abc"

6樓:匿名使用者

第一種方式是對的,方案一是定義了一個指標變數,將字串首地址給p。第二種方法是錯的,方案二先定義的是陣列,陣列名是不能賦值的,只是陣列首地址。

7樓:匿名使用者

「abc」這個字串是存放於程式專門保留的用於初始化變數的儲存區

char *p; p="abc";之後p將指向這個區域中的該字串起始地址;

char p[5]; p="abc";如果合法了,p也將指向這個區域中的地址,而你為變數p分配的儲存區將回丟失,一般編譯器認為這種情況p是一個代號,並不是變數,程式中用到p的地方編譯器將自動替換成你開的儲存區的首地址,所以給一個標號或者說別名幅值是非法的。

8樓:匿名使用者

前者合法。

如為 char p[5];

則在表示式中使用時,p是一個常量指標,不能給它賦值,只能在它定義時進行初始化。

"abc"是一個字串常量,在表示式中使用時,它也是一個指向字元的常量指標。

但 char p="abc"; 是可以的,這時可以自動判斷字元陣列p的長度為多少

char* p = 「abc」; 為何列印p會輸出abc,p明明是個指標。編譯器內部做了什麼工作嗎

9樓:mr_冷邪

這個不是表示相等。這個叫做賦值,等號又叫做賦值運算子,判斷相等的是用兩個等號,關係運算子==。

接下來給你解釋這句話,這條語句首先宣告瞭一個字元型的指標變數,指標是用來儲存地址的,那麼右邊則是一個字串常量,字串常量就是一個地址,表現形式就是這個字串的首地址,用一個字元型的指標指向一個首地址,那麼通過這個指標就可以訪問整個字串了。不管是變數還是常量,在記憶體中都有對應的儲存空間,這句話就是用一個字元型的指標儲存了一個字串的首地址。還不懂可以追問

c語言中,char a[] = "abc"; char *p = "cdef";

10樓:

char a = "abc"; 中a是陣列抄名,編譯時為其分配

襲4個char單元,前3個單元用「abc"中的字元對應初始化,最後一個存放'\0';char *p = "cdef";在編譯時先生成"cdef"字串常量,存放在常量區,並將首地址(c的地址)賦給char *型指標變數p。從以上可見,a是陣列,所以其中的元素abc都可變,可以重寫;而p指向的是常量,不可更改。

11樓:

區別就在於,陣列名a和指標變數p雖然本質上都是地址,但是陣列名a它的地址是不變的

內,即它是一個常指標,容指向是固定不變的;但是指標p是個指標變數,它的指向是可以改變的,你可以將a的地址賦值給p,即p=a;那麼指標p就指向了陣列a的首元素地址了,但是陣列名a它在賦值語句中是不能做左值的,因為它是一個常指標,和一個常量沒什麼區別。

12樓:匿名使用者

a定義是一個字串

陣列,*p定義的是一個字串常量。陣列名a是一個常量,指標p是一個變專量,屬當用作指標時,都能使用a+1,p+1,但是p++正確,a++錯誤,

通過a能改變陣列裡的元素的內容,但是不能通過p來改變它指向的字串,因為常量是不能更改的。a[2]=d正確,p[2]=d錯誤

13樓:匿名使用者

sizeof(a)=4 sizeof(p)=4 這裡不一樣

c++中不能把字串常量賦值給字元型指標?看下面的**

14樓:匿名使用者

執行出錯是因為你試圖將p2所指的字串拼接到p1所指的字串(strcat),這兩個字串都是常量,所以執行就出錯了。

你編譯時出現警告是因為你將字串賦值常量給char型別的指標。在c++中,字串常量的型別是 "const char [n]" (n是字串的長度+1),所以出現型別不匹配,但是為了向後相容c語言,所以編譯器只給了警告。

15樓:匿名使用者

char *p="abc"

這樣定義編譯器預設把abc當做常量,也就是等價於const char *p="abc"

你用strcat,就改變了p1的值了,所以報錯解決方法如下:

方法一:

char s1="abc", s2[2]="def";

char *p1, *p2;

p1=s1;

p2=s2;

strcat(p1, p2);

方法二:

把程式用release編譯看看可以用不,vc6下debug模式下式常量,release就是普通變數了

16樓:匿名使用者

指標只是代表了一個地址,你定義一個指標變數的時候並沒有開闢記憶體,char *p = "abc"; 這種寫法相當於char *p; p = "abc";這明顯是不對的,p是指標變數,能給p賦值的一定是地址,相反這樣寫 char s[10] = "abc..."; char *p = s;這樣寫就可以通過編譯了,因為s表示的是字串abc...的首地址

char *p[3]={"abc","bcd","cde"};為什麼輸出p[0]的是abc,不應該是這字串的首地址嗎

17樓:

你的理解不錯,但輸出函式在「輸出字串」狀態下「看」到字串的「首地址」後,就從這個首地址開始,把其中的字元依次往螢幕上列印,直到遇到'\0'後停止,但不輸出'\0'——所以這是輸出函式的功能,要求的就是字串的首地址。

在c++中,為什麼char *p="hello world"; cout<

18樓:塞曼容

指標p指向字串常量"hello word",即p中存放該字串的首地址,c++為了相容c語言,當輸出常量字串的首地址時實際輸出該字串。cout<<(int)p;則為p的內容,即字串的地址,而cout<<&p;為指標變數的地址,而非上述字串的地址。僅供參考。求採納

c語言問題答案為什麼選c語言問題,答案為什麼選b

個人覺得答案是a有問題 16位 int是2個位元組,所以指標移動一個位元組很明顯是出問題了另外這個儲存單元指的是定義的資料型別佔用的空間大小,指標移動一個位置與指標移動一個儲存單元是一樣的,並沒有什麼問題,不知道答案b是怎麼得出來的 不管是移動2個位元組,1個位置,1個單元,本身就沒有問題,這個取決...

c語言問題,程式如下,執行結果為什麼是3,5,3,我看是3,

int a 3,b 5,c 7 if a b a b 這個if語句不成立 所以b不會賦值給ac a 這是把a賦值給c 這時a 3,b 5,c 3if c a c b 因為c等於a 所以這句不執行printf d,d,d n a,b,c 最後結果 3 5 3 include main 等價於 incl...

c語言小問題,為什麼結果是 1,謝謝

ffff是的2進位制數是1111 1111 1111 1111它的反碼為1000 0000 0000 0000 符號位不變補碼就是1000 0000 0000 0001一共16個1 佔4個位元組 x為char型 資料溢位 只能儲存8個二進位制數 符號位和後面7位 就是1000 0001 符號位為1 ...