c符陣列和字元指標,C 字元陣列和字元指標

2021-12-23 01:01:31 字數 2928 閱讀 7893

1樓:檢霽杜鵾

你這個問題問得很好,我們知道實際上一個字串在進行賦值的時候,例如:

char

*p="hello

world";這樣賦值是允許的。那麼這並不代表"hello

world"這個就是一個指標,實際上我們的這一動作,編譯器在幕後為我們做了很多事,首先在常量區分配一個字元陣列,然後將"hello

world"這個字串中的字元(包括最後的'\0'字元。)拷貝到此陣列(其實此陣列我們可以看成是一個匿名陣列,因為沒有陣列名)。然後返回陣列首元素的地址,將此地址賦值給字元指標變數p。

我們知道在c語言中沒有字串這種型別,在c語言中的字串是通過字元陣列來實現的,而且必須要求此字元陣列具有'\0'結束符。這就是字串與一般的字元陣列不同的地方。

話說回來,你問到為什麼char

*p="hello

world";

cout<

為什麼會這樣呢,我想著應該是語言的特性,或者是編譯器的特性。既然c語言中字串是通過帶'\0'的字元陣列實現的,那麼請問如果編譯器是由你來實現的,或者是printf()函式是你寫的,要輸出一個字串的話你會怎麼樣呢,你是不是會輸出指標的地址呢,cout<

這就是cout的行為,沒有為什麼。

其實你自己可以寫一個自己的cout函式,輸出地址而不是按照cout的預設行為。當然要實現cout的功能,必須要了解很多底層知識。

我們可以通過這樣的方式輸出字元指標的值,而不是輸出以其為首地址的字串。例如char

a='a';

char

*p=&a;

cout<<(int)(p)<

只需要將指標的值(地址值實際上在記憶體中就是一個整數,標識了記憶體的地址,只不過編譯器認為其實指標型別罷了,實際上從本質上來說,計算機中的任何型別在記憶體中都是以二進位制的形式存在的,根本沒有所謂的型別之分。為什麼有型別,這就是編譯器將底層抽象的結果)。

2樓:匿名使用者

指標就是指標沒有什麼不同。 只是在輸出這裡「人性化地」對指向字元的指標做了點特殊處理, 不列印地址而當作字串來列印。 你可以把這個型別的輸出作為一個特例

string *就是一個普通的指標了, 想看成字串也沒法弄

3樓:匿名使用者

char *sp="example one";

char sa="two";

cout<<&sp[0];得到地址

cout<<&sa[0];得到地址

4樓:匿名使用者

cout << *ss;

c++字元陣列和字串陣列?

5樓:草原上之狼

實際上,字元陣列和普通陣列一樣,沒有本質區別。請大家注意陣列型別的含義:資料型別指的是陣列所包含的元素的型別,而不是陣列名的型別,陣列名永遠是一個指標,指向第一個元素的地址,即陣列首地址。

字元陣列的每個元素都是char型別,整型陣列的每個元素都是int型別。scanf() 和 printf() 函式有一種格式化字串 %s 可以用來整體輸入輸出字元陣列,但是沒有特定的格式支援 int 陣列整體陣列輸出。

c語言中字元陣列和字元指標的問題

6樓:千鋒教育

在函式內 char陣列被定義成局

部變數,函式執行後會被系統給釋放掉。 但char*p 則是定義成一個常量,程式執行完後才會釋放掉。所以在返回char p 時會返回亂碼,但 char*p 則可以全部顯示出來

當然 char 也可以定義成靜態變數 這樣就可以顯示出來了不如static char p="hello";

7樓:匿名使用者

指標本身沒什麼生存期,它指向的記憶體的內容才有生存期。

換成char *p="hello world"之後,之所以可以正常輸出「hello world」,我的理解是,編譯器在靜態儲存區申請了一段記憶體,就算getmemory返回了,這段內容依然有效,所以能正常輸出。

而char p="hello world",p指向的是棧,函式返回這段記憶體就會無效。

8樓:

贊同jzp1的分析,我再舉個jzp1說的不規範的使用方法,該返回一樣可以列印出字串:

char *getmemory(void)

int main(int argc, char* ar**)

9樓:

是相等的,你這裡後面那個問題可以正常輸出是因為hello world是個字串常量,不再是儲存在棧記憶體裡面。

10樓:水閣公子

兩個字串被放在不同的區內,一個在棧區,一個在字串常量區,棧區的隨函式呼叫結束而消失,常量區,一般是跟這個程序的生命一致。

11樓:匿名使用者

函式也是個作用域,如果是棧儲存的,出了這個作用域,自然會釋放,不論是指標、陣列還是變數

12樓:匿名使用者

也許在函式返回時把函式中生成的陣列所佔用的空間收回或者覆蓋了別的內容。

而僅僅是指標指向的地址可能不在棧上開闢,那麼即使函式中定義的指標被**了,該指標指向的地址也沒有**。你可以程式設計試試。那個p指標所在的地址肯定**了,但是p指標指向的地址可能沒有**或者**了沒有覆蓋它。

要麼是'\0'的問題,加個'\0'試試看。

C語言中字元陣列和字元指標

又問了一遍哈,我就知道這麼多了 前者是靜態的,也就是每次都要設定一個最大的max上限才能保證不會越界。後者是動態的,你可以用多少就申請多少,可以在任何時候擴大或減小 free 當資料很大時,就需要把不用的空間free,而直接開陣列不可以 另外如果在main內,陣列不能開很大,但是卻可以malloc一...

C語言字元陣列程式設計題,c語言字元陣列和字串程式設計題 求解

思路 按題意,用指標遍歷字串st,使用標識變數flag首次遇到字母置1並計數,遇到空格時flag重置0。注意 本程式不考慮夾雜非字母的情況,請規範輸入。比如 i am a stu dent stu dent將作為一個單詞識別。下面是 include int getwordnum char st ch...

c 中字元陣列,如何轉成字串啊

如果你想把一個字串變成陣列,你只需要將字串初始化為陣列變數的值即可。例如 char c 10 this is 在c 裡字串在記憶體的儲存方式就是按字串陣列的形式儲存的,所以不用轉換!用cstring的getbuffer函式返回一個存放字元的頭指標,用一個char 來接受他,然後用下標操作就可以了。例...