天天看點

翁恺老師C語言學習筆記(十一)字元串_字元串常量

字元串常量

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,才能說明它所指的是字元串

繼續閱讀