char 和char 的區別

2021-07-02 15:13:27 字數 2433 閱讀 7679

1、char是乙個陣列定義,char*是指標定義(也稱char為靜態陣列,char*為動態陣列)。

2、指標和陣列的區別

(1)指標和陣列的分配

陣列是開闢一塊連續的記憶體空間,陣列本身的識別符號(也就是通常所說的陣列名)代表整個陣列,可以使用sizeof來獲得陣列所佔據記憶體空間的大小(注意,不是陣列元素的個數,而是陣列佔據記憶體空間的大小,這是以位元組為單位的)。舉例如下:

#include

void

main() ;

printf("a:%d\n"

, sizeof

(a));

printf("bmemory size: %d bytes\n"

, sizeof

(b));

printf("belements: %d\n"

, sizeof

(b) /

sizeof

(int

));

getchar();

return;

}執行結果:

陣列a為字元型,後面的字串實際上佔據6個位元組空間(注意最後有乙個\0標識字串結束)。sizeof(b)就可以看出如何獲得陣列佔據的記憶體空間,vs編譯器為int型別分配4個位元組的記憶體空間,通過sizeof(b)/sizeof(int)就可以算出陣列元素個數。

(1)空間的分配

這裡又分為兩種情況。 第

一、如果是全域性的和靜態的

char *p =「hello」;

這裡定義了乙個指標,指向rodata section裡面的「hello」,可以被編譯器放到字串池。在彙編裡面的關鍵字為.ltorg。意思就是在字串池裡的字串是可以共享的,這也是編譯器優化的乙個措施。

char a = 「hello」;

這裡定義了乙個陣列,分配在可寫資料塊,不會被放到字串池。

第二、如果是區域性的

char *p =「hello」;

這裡定義了乙個指標,指向rodata section裡面的「hello」,可以被編譯器放到字串池。在彙編裡面的關鍵字為.ltorg。意思就是在字串池裡的字串是可以共享的,這也是編譯器優化的乙個措施。另外,在函式中可以返回它的位址,也就是說,指標是區域性變數,但是它所指向的內容是全域性的。

char a = 「hello」;

這是定義了乙個陣列,分配在堆疊上,初始化由編譯器進行(短的時候直接用指令填充,長的時候就從全域性字串拷貝),不會被放到字串池(同樣如前,可能會從字串池中拷貝過來)。注意不應該返回它的位址。

附:

1、對於整型指標,如int *p = new int;那麼cout<

例項**:

#include

"stdafx.h"

#include

#include

using

namespace

std;

void

main()

執行結果:

這裡的char ch=「abc」;表示ch是乙個足以存放字串初值和空字元『/0』的一維陣列,可以更改陣列中的字元,但是ch本身是不可改變的常量。

char *pch = 「abc」;這裡pch是乙個指標,其初值指向乙個字串常量,之後它可以指向其他位置,但如果試圖修改字串的內容,結果將不確定。

總結:

1、 char p表示p是乙個陣列指標,相當於const pointer,不允許對該指標進行修改。但該指標所指向的陣列內容,是分配在棧上面的,是可以修改的。

2、char * pch表示pp是乙個可變指標,允許對其進行修改,即可以指向其他地方,如pch= p也是可以的。對於*pch = "abc";這樣的情況,由於編譯器優化,一般都會將abc存放在常量區域內,然後pp指標是區域性變數,存放在棧中,因此,在函式返回中,允許返回該位址(實際上指向乙個常量位址,字串常量區);而,char p是區域性變數,當函式結束,存在棧中的陣列內容均被銷毀,因此返回p位址是不允許的。

同時,從上面的例子可以看出,cout確實存在一些規律:

1、對於數字指標如int*p=new int; 那麼cout<

分析上面的程式:

*pch = "abc";

p = "abc";

*pch指向的是字串中的第乙個字元。

cout << *p; // 返回第乙個字元:a

cout << *(p+1); // 返回第二個字元:b

cout << &p[1];// 返回從第二個字元開始的字串:bc

2023年5月16日

char 和char 的區別

char c abc c 0 t char c1 def c1 0 t err 首先c1是乙個指標,它只是指向 def 這個記憶體塊。而 abc 是乙個常量區,不可以對其進行更改。而c定義的是乙個陣列,在分配記憶體時,會自動給它分配四個位元組的位址,並且會進行乙份拷貝工作,此時分配是在棧區進行的,是...

char 和char 的區別

之前在用到char 和char,用到srtncat,讓char對char 進行新增時執行會崩潰,之後做了一些分析和練習,對char 和char有了更深的理解。下面附上一些測試資料。include include include using namespace std int main cout do...

char 和 char 的區別

最近在做牛客網上的程式設計題時遇到了char 的用法,之前一直認為char 和char 沒有區別,乙個簡單的字串中空格替換,差點難倒了,因此,仔細蒐羅了一下char 和char 方面的知識,在此做個總結,方便以後檢視。舉個簡單的例子 char s1 hello char s2 hello 區別 s1...