**:
陣列要麼在靜態儲存區被建立(如全域性陣列),要麼在棧上被建立。指標可以隨時指向任意型別的記憶體塊。
(1) 修改內容上的差別
char a = "hello";
a[0] = 'x';
char *p- = "world";//注意p指向常量字串
p[0] = 'x'; //編譯器不能發現該錯誤,執行時錯誤
(2) 用運算子sizeof可以計算出陣列的容量(位元組數)。sizeof(p),p為指標得到的是乙個指標變數的位元組數,而不是p所指的記憶體容量。c++/c語言沒有辦法知道指標所指的記憶體容量,除非在申請記憶體時記住它。注意當陣列作為函式的引數進行傳遞時,該陣列自動退化為同型別的指標。
char a = "hello world";
char *p = a;
cout<< sizeof(a) << endl; //12位元組
cout<< sizeof(p) << endl; //4位元組
計算陣列和指標的記憶體容量
void func(char a[100])
sizeof 指標 陣列
-------------------------------------------
char p; // 編譯不過
char p[0]; // sizeof(p) = 0
char p[8]; // sizeof(p) = 8
char * p = malloc (10); // sizeof(p) = 4
用運算子sizeof可以計算出陣列的容量(位元組數),但是計算不出指標指向空間的容量,只能計算出指標變數的空間容量(4位元組)
指標就是指標,成不了陣列
《c陷阱和缺陷》p41
----------------------------------------------
在c語言中,我們沒有辦法可以將乙個陣列作為函式引數直接傳遞。如果我們使用陣列名作為引數,那麼陣列名會立即被轉換為指向該陣列第1個元素的指標。例如,下面的語句:
char hello = "hello";
宣告了hello是乙個字元陣列。如果將該陣列作為引數傳遞給乙個函式,
printf ("%s\n", hello);
實際上與將該陣列第1個元素的位址作為引數傳遞給函式的作用完全等效,即:
printf ("%s\n", &hello[0]);
因此,將陣列作為函式引數毫無意義。所以,c語言中會自動地將作為引數的陣列宣告轉換為相應的指標宣告。也就是說,像這樣的寫法:
int strlen (char s)
與下面的寫法完全相同:
int strlen (char *s)
字元陣列與字元指標的區別以及字串常量的修改
字元陣列 char string 20 hello zhao 字元指標char str hello zhao 把字串常量的首位址賦給了這個字元指標str 區別 字元陣列是在記憶體中開了一段空間用來存放 hello zhao 如下所示 he lloz hao 0 string是陣列名,其實乙個常量 或...
字元陣列,字元指標,字串常量
一 字串可以賦值給字元指標變數 char p hello 其實這裡分配了常量,即const,如果不讓p指向別的位址就無法修改。char q world cout p q 1.字串常量 hello 出現在乙個表示式中時,hello 表示式使用的值就是這些字元所儲存的位址 在常量區 而不是這些字元本身。...
字串陣列與字串指標的區別
字元指標變數和字元陣列的區別 簡單說一下 字串陣列是用來存放字串的陣列,在記憶體中佔一段連續的單元。所佔記憶體存放的是字串。定義方法為 char a n n為常量表示式,可初始化。字元指標是指向字元的指標,所佔記憶體單元存放的是所指字元的記憶體單元。定義方法為 char p 完整的解答 1 字元陣列...