字元串常量
char* s = "Hello,world!"
我們先看一段代碼
#include<stdio.h>
int main(void) {
char *s = "Hello World";
s[0] = 'B';
printf("Here!s[0]=%c\n", s[0]);
return 0;
}
我在這裡編譯時會報錯,老師這裡竟然時通過的,網上查了下,有兩種方案,有幾種方案,我是用了const 改變為常量
[Warning] deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
#include<stdio.h>
int main(void) {
const char *s ="Hello World";
//s[0] = 'B';
const char *s2 ="Hello World";
printf("s=%p\n", s);
printf("s2=%p\n", s2);
printf("Here!s[0]=%c\n", s[0]);
return 0;
}
輸出結果:
s=00404000
s2=00404000
Here!s[0]=H
從這裡我們可以看出,他們在記憶體中的位址是一樣的,我們再添加一個i
#include<stdio.h>
int main(void) {
int i=0;
const char *s ="Hello World";
//s[0] = 'B';
const char *s2 ="Hello World";
printf("i=%p\n", &i);
printf("s=%p\n", s);
printf("s2=%p\n", s2);
printf("Here!s[0]=%c\n", s[0]);
return 0;
}
i=0062FE94
s=00404000
s2=00404000
Here!s[0]=H
這裡可以看出i的位址比s和s2的位址要大很多,i是本地變量,它比較大,而s和s2很小它們存放在記憶體中的代碼段
并且是隻讀屬性,是以剛才我們那裡有報錯,因為是隻讀的不可修改的
字元串常量
char s =“Hello World”;
· s是一個指針,初始化為指向一個字元串常量;
**· 由于這個常量所在的地方,實際上s是const chars,但是由于曆史原因,IDE接受不帶const的寫法**
· 但是視圖對s所指的字元串寫入,會導緻嚴重後果
· 如果想要修改則需要這樣的寫法
char s[] =“Hello World”;
下面我們來試試
#include<stdio.h>
int main(void) {
int i=0;
const char *s ="Hello World";
//s[0] = 'B';
const char *s2 ="Hello World";
char s3[] = "Hello World";
printf("i=%p\n", &i);
printf("s=%p\n", s);
printf("s2=%p\n", s2);
printf("s3=%p\n", s3);
s3[0] = 'B';
printf("Here!s3[0]=%c\n", s3[0]);
return 0;
}
輸出結果:
i=0062FE94
s=00404000
s2=00404000
s3=0062FE88
Here!s3[0]=B
我們看到s3也在一個比較大的地方,同時也是可以修改的
那麼,當我們需要一個字元串的時候,我們該如何寫了?
指針還是數組
· char *str = “Hello”;
· char word[] = “Hello”;
· 數組:這個字元串在記憶體固定區域位址
· 作為本地變量空間會被自動回收的
· 指針:這個字元串不知道在記憶體那一塊
· 處理參數
· 動态配置設定記憶體空間
從這裡可以得出:
如果要構造一個字元串,需要用數組
如果要處理一個字元串,需要用指針
char 是不是字元串*
· 字元串可以表達char*的形式
· char*不一定是字元串
· 本意是指向字元的指針,可能指向的是字元
· 隻有它所指的字元數組有結尾的\0,才能說明它所指的是字元串