小白來學C語言之字符串與指針

初學C語言,指針的確是一個坎,但這又是基礎,不得不學。真的學了好久,總是一知半解,也不怎麼會做題,寫下這篇博客,希望能幫助剛出門的小白,後續還有C語言指針例題以及詳解。
不怎麼會C語言數組與指針的可以先看下這個,絕對良心拒絕入坑。
C語言數組與指針,拒絕入坑https://blog.csdn.net/weixin_45755332/article/details/106851798

這裏是有關指針的練習題,來自被譚浩強折磨的大學生

字符數組

定義:

char  arr[n];

初始化賦值:

char arr[5]={'a','b','c','d','e'};//注意,字符串類型的必須要加引號 '  '

也可以用ascll碼來定義

	char arr[5]={65,66,'c','d','e'}; 
	printf("%c",arr[1]);  //  B 

引用

	char arr[5]={65,66,'c','d','e'};
	for (int i =0;i<5;i++){
		printf("%c ",arr[i]);//A B c d e
	}	

可以看出一般語法字符數組和其他類型的數組是一樣的
{\color{Red}下面來看看不同的地方}

字符串

字符數組最後加了一個’\0’表示字符串的結束
字符串:就是一串字符,之前的數組是一個一個的組起來的。


輸出時字符串可以一起輸出,數組只能單個輸出
注意這裏是 %s

	char arr[ ]={'a','b','c','d','\0'};
	printf("%s",arr);	//abcd

當然還有更簡單的,直接不用加\0,他自己給你加,(當然加也可以,他不會輸出的)

char arr1[]="abcd";
printf("%s",arr1);	 //abcd

🐖意:如果你寫的是arr[5],那麼他之能保存四個字符因爲最後一個 \0 他是存在的(沒顯示而已),也佔一個字符位置。
上面兩種類型的區別:他們開闢的內存空間是不一樣的,
第一種是在數組中開闢了五個空間,分別存放五個字符,內存空間如左圖。
第二種是將abcd放到一個只讀區域,arr1開始並沒有這些字符,arr1[]=“abcd”;是把abcd拷貝了一份給了arr1[ ]。
在這裏插入圖片描述在這裏插入圖片描述



當然也可以用for循環輸出

		char arr1[]="abcdefg";
		for (int i =0;i<7;i++){
		printf("%c ",arr1[i]); //a b c d e f g
	}

string.h 進行賦值

想要對已定義的字符串進行更改,是不能直接改的,如下是錯誤的。當然如果不嫌麻煩可以一個一個的改,就是arr[0]="a“,arr[1]="b"這樣。

char arr[10]="ewrgga";
arr[ ]="laoli";

爲了更改方便我們引入一下函數庫string.h
調用**strcpy()**函數。
注意不要越界也就是arr[10]之能copy9個字符

#include <stdio.h>
#include <string.h>
int main(){ 
	char arr[10]="ewrgga";
	strcpy(arr,"abcdefg");
	printf("%s  ",arr); //abcdefg
}

字符串與指針

字符串的訪問

如我們定義了一個字符串

char string[]="I love China!";

其內存如圖所示。
在這裏插入圖片描述
注意與數組和指針是一樣的,string是字符串名,又是字符串的首地址

	char string[]="I love China!";
	printf("%s  ",string);		//源字符串   I love China!
	printf("%d  ",&string);   //字符串的首地址  	6487568
	printf("%c  ",*string);  //字符串首地址的內容	 I
	
	printf("%d  ",string+7);	//字符一個佔一個字節,這裏的string就代表首地址,加7就相當於往後移動了七個字節,到了C的地址的位置   6487575
	printf("%c  ",*(string+7)); // 打印下該地址的字符是啥  C
	printf("%c  ",string+7);  // 從C開始往後打印    China!

用字符指針訪問

#include <stdio.h>
int main(){
	char *str="I love China!";
	printf("%s\n",str);
	str+=7;
	while(*str){
	printf("%s\n",str[0]);
		putchar(str[0]);
		str++;
	}
}

I love China!
China!

說明:

  1. 這裏putchar就相當於printf,是逐個字符打印
  2. 這裏*str是一個指針變量,上面那個代碼中的string是一個常量,但都存放了字符串的首地址。變量可以自身++,而常量不可以
  3. while(str),意思就是str != 0,當 *str到了這個字符串最後 \0 時,*str就是0了;循環結束。

字符指針變量與字符數組

char *cp;與char str[10]

  • str由若干元素組成,每個元素放一個字符;而*cp中存放字符串首地址。指針變量只能存放地址,數組是有自己的空間的
  • 以下第一部分這樣賦值是不合法的.想要賦值,如下二三部分,可以一個一個賦值或者初始化時賦值。
char str[20];
str= "I love China!";
********************************
str[0]='I';
str[1]= 'l';
...
...
********************************
char str[20] = "I love China!";
  • 而如下兩種賦值都是可以的
char *cp;
cp = "I love China!";
*****************************
char *cp = "I love China!";
  • str是地址常量,cp是地址變量
  • cp接受鍵入字符串是,必須先開闢存儲空間。如第一部分鍵入常量是可以的,第二部分用鍵入指針變量是不行的,因爲沒有開闢空間,所以可以用第三部分,先給指針開闢一個空間,再鍵入字符串。
char str[10];
scanf("%s",str);
**********************
char *cp;
scanf("%s",cp);
************************
char *cp,sre[10];
cp=str;
scanf("%s",cp);

字符指針變量使用注意事項

當字符指針執行指向字符串時,除了可以被賦值之外,與包含字符串的字符數組沒有什麼區別。

與上面那個相似,只是這個先把字符串賦值給了pstr,然後再strcpy給str。這與上面那個strcpy的主要區別就是,這個先定義了str[3],原本只能放兩個字符的,現在能放多個了,也就是不受中括號裏面的限制了

#include <stdio.h>
#include <string.h>
int main(){
	char str[3],*pstr;
	pstr="12345";
	strcpy(str,pstr);
	pstr=str;
	printf("%d",strlen(pstr)); //6
	printf("%d",strlen(str)); //6
}

畢竟是小白,從小白視角看可能不會太深,但像我一樣的小白應該都能看懂。
這篇博客主要是寫給新手的,希望大家都能學懂學好,嘿嘿,寫的不好還望大佬勿噴。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章