C語言知識彙總 | 51-C語言字串指標(指向字串的指標)
一、字串指標
C語言中沒有特定的字串型別,通常是將字串放在一個字元陣列中,這裡不妨演示一下:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "https://www.csdn.net";
int len = strlen(str), i;
//直接輸出字串
printf("%s\n", str);
//每次輸出一個字元
for(i=0; i<len; i++){
printf("%c", str[i]);
}
printf("\n");
return 0;
}
執行結果:
https://www.csdn.net
https://www.csdn.net
字元陣列歸根結底還是一個陣列,關於指標和陣列的規則同樣也適用於字元陣列。更改上面的程式碼,使用指標的方式來輸出字串:
#include <stdio.h>
#include <string.h>
int main()
{
char str[] = "https://www.csdn.net";
char *pstr = str;
int len = strlen(str), i;
//使用*(pstr+i)
for(i=0; i<len; i++){
printf("%c", *(pstr+i));
}
printf("\n");
//使用pstr[i]
for(i=0; i<len; i++){
printf("%c", pstr[i]);
}
printf("\n");
//使用*(str+i)
for(i=0; i<len; i++){
printf("%c", *(str+i));
}
printf("\n");
return 0;
}
執行結果:
https://www.csdn.net
https://www.csdn.net
https://www.csdn.net
除了字元陣列,C語言還支援另外一種表示字串的方法,就是直接使用一個指標指向字串,例如:
char *str = "https://www.csdn.net";
或者:
char *str;
str = "char *str = "https://www.csdn.net";
字串中的所有字元在記憶體中是連續排列的,str 指向的是字串的第 0 個字元;我們通常將第 0 個字元的地址稱為字串的首地址。字串中每個字元的型別都是char
,所以 str 的型別也必須是char *
。
下面的例子演示瞭如何輸出這種字串:
#include <stdio.h>
#include <string.h>
int main()
{
char *str = "https://www.csdn.net";
int len = strlen(str), i;
//直接輸出字串
printf("%s\n", str);
//使用*(str+i)
for(i=0; i<len; i++){
printf("%c", *(str+i));
}
printf("\n");
//使用str[i]
for(i=0; i<len; i++){
printf("%c", str[i]);
}
printf("\n");
return 0;
}
執行結果:
https://www.csdn.net
https://www.csdn.net
https://www.csdn.net
這一切看起來和字元陣列是多麼地相似,它們都可以使用%s
輸出整個字串,都可以使用*
或[ ]
獲取單個字元,這兩種表示字串的方式是不是就沒有區別了呢?
有!它們最根本的區別是在記憶體中的儲存區域不一樣,字元陣列儲存在全域性資料區或棧區,第二種形式的字串儲存在常量區。全域性資料區和棧區的字串(也包括其他資料)有讀取和寫入的許可權,而常量區的字串(也包括其他資料)只有讀取許可權,沒有寫入許可權。
記憶體許可權的不同導致的一個明顯結果就是,字元陣列在定義後可以讀取和修改每個字元,而對於第二種形式的字串,一旦被定義後就只能讀取不能修改,任何對它的賦值都是錯誤的。
我們將第二種形式的字串稱為字串常量,意思很明顯,常量只能讀取不能寫入。請看下面的演示:
#include <stdio.h>
int main()
{
char *str = "Hello World!";
str = "I love C!"; //正確
str[3] = 'P'; //錯誤
return 0;
}
這段程式碼能夠正常編譯和連結,但在執行時會出現段錯誤(Segment Fault)或者寫入位置錯誤。
第5行程式碼是正確的,可以更改指標變數本身的指向;第6行程式碼是錯誤的,不能修改字串中的字元。
二、到底使用字元陣列還是字串常量
在程式設計過程中如果只涉及到對字串的讀取,那麼字元陣列和字串常量都能夠滿足要求;如果有寫入(修改)操作,那麼只能使用字元陣列,不能使用字串常量。
獲取使用者輸入的字串就是一個典型的寫入操作,只能使用字元陣列,不能使用字串常量,請看下面的程式碼:
#include <stdio.h>
int main()
{
char str[30];
gets(str);
printf("%s\n", str);
return 0;
}
執行結果:
C C++ Java Python JavaScript
C C++ Java Python JavaScript
最後總結一下,C語言有兩種表示字串的方法,一種是字元陣列,另一種是字串常量,它們在記憶體中的儲存位置不同,使得字元陣列可以讀取和修改,而字串常量只能讀取不能修改。
相關文章
- C語言知識彙總 | 56-C語言NULL空指標以及void指標C語言Null指標
- c語言指標彙總C語言指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- C語言指標基本知識C語言指標
- C語言學習之:指標與字串C語言指標字串
- C語言指標C語言指標
- C語言:利用指標檢查字串是否是迴文C語言指標字串
- C語言 第 7 節 如何將字串指標指向的內容賦值給陣列C語言字串指標賦值陣列
- C語言指標(二) 指標變數 ----by xhxhC語言指標變數
- C語言 函式指標C語言函式指標
- C語言指標筆記C語言指標筆記
- C語言基礎-指標C語言指標
- C語言指標學習C語言指標
- C語言指標用法大全C語言指標
- C語言知識彙總 | 00-C語言知識彙總目錄C語言
- C語言基礎-1、指標C語言指標
- c語言實現this指標效果C語言指標
- 搞清楚C語言指標C語言指標
- C語言指標詳解(一)C語言指標
- C語言指標詳解(二)C語言指標
- C語言 指標與陣列C語言指標陣列
- 浙江大學 PTA C語言-實驗8.2 指標與字串 7-2 字串排序C語言指標字串排序
- C語言:使用指標將兩段字串連線起來輸出C語言指標字串
- GO語言————4.9、指標Go指標
- C語言指標常見問題C語言指標
- c語言-運算子,陣列,指標C語言陣列指標
- c語言函式指標的定義C語言函式指標
- C語言指標總結大學霸IT達人C語言指標
- C++語言程式設計筆記 - 第6章 - 陣列、指標與字串C++程式設計筆記陣列指標字串
- go 語言指標學習Go指標
- C語言字串C語言字串
- C語言指標應用程式設計C語言指標程式設計
- c 語言指標操作經典問題指標
- 滴水逆向筆記系列-c語言總結4-15.switch語句反彙編-16.指標1-17.指標2筆記C語言指標
- C語言指標和陣列筆試題C語言指標陣列筆試
- 如何掌握 C 語言的一大利器——指標?指標
- (C語言)使用指標列印陣列的內容C語言指標陣列
- Go 語言指標符號 *和&Go指標符號