讓我們通過下面的例子,來了解 C語言中字符數組和字符指針之間的區(qū)別。
void test() { //arr is array of characters char arr[12] = "Aticleworld"; //ptr is pointer to char char *ptr = "Aticleworld"; }現在,讓我們比較arr(字符數組)和ptr(字符指針)。
區(qū)別1: 字符串文本是用雙引號括起來的零個或多個多字節(jié)字符的序列。當你編寫語句 char arr[12] = "Aticleworld"時,字符串文本中的字符被復制到 arr. 當您編寫語句 char *ptr = "Aticleworld"時,您是讓字符串文本數組進行數組到指針的轉換,以獲取指向其第一個元素的指針。指針 ptr 指向字符串文本數組的第一個元素 ('A').
區(qū)別2: arr 是存儲在連續(xù)內存位置的字符集合,而 ptr 保存字符的地址。
arr 包含 12 個元素,每個元素位于連續(xù)的內存位置。另一方面,ptr 保存字符串文本的第一個字符的地址。
區(qū)別3:當我們在 char 數組 arr 上使用 sizeof 運算符時,它給出字符總數,而 char 指針 ptr 只給出指針的大小。如下:
#includeint main() { //arr is array of characters char arr[] = "Aticleworld"; //ptr is pointer to char char *ptr = "Aticleworld"; printf("Size of arr %ld ", sizeof(arr)); // sizeof a pointer is printed which is same for all type // of pointers (char *, void *, etc) printf("Size of ptr %ld", sizeof(ptr)); return 0; }
輸出
Size of arr 24 Size of ptr 4區(qū)別4: 和指針之間的另一個重要區(qū)別是,我們可以增加指針,但不能創(chuàng)建數組的增量。例
arr++ =>非法語句。 ptr++==>正常語句。區(qū)別5:我們可以將值重新分配給數組,但字符串文本不可修改。如果程序嘗試修改由字符串文本形成的靜態(tài)數組,則行為未定義。例
//arr is array of characters char arr[] = "Aticleworld"; gets(arr); fgets(arr,sizeof(arr),stdin); //有效表達式 scanf("%s", arr); //有效表達式 strcpy(arr, "aticle"); //有效表達式 arr[0] = 'a'; //有效表達式 arr[10] = 'M'; //有效表達式 arr[11] = 'M'; //有效表達式
char *ptr = "Aticleworld"; ptr[0]='P';//無效表達式 *ptr='W';//無效表達式無別6: 未初始化的指針也可能導致未定義的行為。請參閱以下示例。
char *ptr; ptr[0] = 'A'; //未定義的行為 gets(ptr); //未定義的行為 scanf(“%s”, ptr); //未定義的行為 strcpy(ptr, “source”); //未定義的行為 strcat(ptr, “second string”); //未定義的行為區(qū)別7: Char數組本質上是靜態(tài)的,這意味著您無法調整數組的大小,而使用指針,您可以在任何時間點更改分配的內存的大小。
區(qū)別8:數組完全由程序控制。它將正確分配所需的內存,并在超出范圍時自動釋放內存。但是,如果分配動態(tài)內存,則char指針的情況有所不同,您必須手動取消分配它,否則會引入內存泄漏。例
void foo1() { //arr是字符數組 char arr[12] = "Aticleworld"; } //Issue memory leak void foo2() { char *ptr = (char*)malloc(12); //忘記釋放內存 }
-
C語言
+關注
關注
180文章
7632瀏覽量
141677 -
字符
+關注
關注
0文章
237瀏覽量
25593 -
指針
+關注
關注
1文章
484瀏覽量
71187 -
數組
+關注
關注
1文章
420瀏覽量
26540 -
char
+關注
關注
0文章
11瀏覽量
3821
原文標題:【軟件】C語言中的char數組和char指針有什么區(qū)別?
文章出處:【微信號:玩轉單片機與嵌入式,微信公眾號:玩轉單片機與嵌入式】歡迎添加關注!文章轉載請注明出處。
發(fā)布評論請先 登錄
C語言數組和指針的區(qū)別

char *和char數組的區(qū)別及內核訪問用戶區(qū)
C語言函數中的傳值和傳指針到底有什么區(qū)別
MCU_C語言中 數組型指針 的應用 -- char (*stringp)[]
![MCU_<b class='flag-5'>C</b><b class='flag-5'>語言中</b> <b class='flag-5'>數組</b>型<b class='flag-5'>指針</b> 的應用 -- <b class='flag-5'>char</b> (*stringp)[]](https://file.elecfans.com/web1/M00/D9/4E/pIYBAF_1ac2Ac0EEAABDkS1IP1s689.png)
Char數組與String是如何從統(tǒng)一走向分離的?

評論