字元陣列和字元指標

2021-06-18 11:50:23 字數 1304 閱讀 2672

/*字元陣列是一段記憶體空間;字元指標是乙個位址,指向一串字元。*/

char str="abcd";

char *str="abcd";

字元陣列是一段記憶體空間;字元指標是乙個位址,指向一串字元

char str="abcd";

char *str="abcd";

上面這兩跳複製語句很相似,其實根本就不是一碼事。對於兩個"abcd",這都是乙個字串常量。第一條語句是將這個字串常量拷貝到陣列的儲存空間中,是我們通常說的賦值,賦值完畢之後,str陣列就和這個字串常量沒什麼關係了。而對於下面這條語句是str指向常量字串(就是將常量字串的位址賦值給了指標str),他們之間存在指向關係。

因此,對於指標str,str[3]='t';這樣的操作是error的,因為常量嗎。而對於陣列,完全ok。

對於指標我們知道可以相互賦值

char *str1="abcdd";

char *str2=str1;/*ok*/

對於陣列頭(我們常說陣列頭,就是乙個指標),抱歉,不可以

char str1="abcd";

char str2;

str2=str1;/*error*/

為什麼呢,難道陣列頭只在某些情況下才能作為指標嗎?額。。。個人理解,陣列頭確實是乙個指標,任何時候,但是他是乙個指標常量,so,賦值不可以啊。另外乙個根據就是對於字元指標str1,str1++這樣的操作是error的。

先看下面一段**

#include

#include

void test(char a,char *b)

int main()

;char *b="1234567";

test(a,b);

return 0;

}執行結果

strlen  a=5,b=7

sizeof  a=4,b=4

對於函式test(),乙個引數a是陣列形式,乙個引數b是指標形式。那麼對於a,b他們還是一段儲存空間和乙個位址的區別嗎?no。這個時候兩個引數是完全一樣的,都是乙個指標,只不過形式不同。而函式的傳值,本質上是乙個賦值操作,以test()為例,就是把main中的a的首位址賦值給了引數a,main中的b賦值給了引數b。ok,既然是賦值,引數a

就是乙個普通的指標了,不在是乙個指標常量

void test(char a,char *b)

這裡的賦值,和自增都是ok的了。

sizeof(a)=4自然也很好理解,因為是指標而不是一段記憶體空間的陣列。

以上都是個人理解,額。。。。如果有人看,如果發下錯誤望指正,本人小菜。

字元指標和字元陣列

1.字元指標可以指向乙個字串。我們可以用字串常量對字元指標進行初始化。例如,有說明語句 char str this is a string.是對字元指標進行初始化。此時,字元指標指向的是乙個字串常量的首位址,即指向字串的首位址。這裡要注意字元指標與字元陣列之間的區別。例如,有說明語句 char st...

字元陣列和字元指標

1.在函式getmem棧內定義個陣列,將位址return給main函式的指標str eg char p hello world char getmemory void char p hello world return p void test void char str null str getme...

字元指標和字元陣列

所有的字串常量都被放在全域性區的靜態儲存區 這歌筆記只為說明乙個問題 char str1 abcd char str2 abcd const char str3 abcd 被const修飾的陣列,如果是區域性變數是存放在棧上的唯讀陣列,不能修改 const char str4 abcd const ...