/*字元陣列是一段記憶體空間;字元指標是乙個位址,指向一串字元。*/
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 ...