字串指標與字元陣列的區別--字串常量的值不能改
注:這裡對概念不是很清楚,應該不叫字串指標,C語言中不存在字串指標這個資料型別。
經常犯錯的知識點,以前也沒有理解,這裡再好好的記錄下。要經常溫固而知新。
用字元陣列和字元指標變數都可實現字串的儲存和運算。但是兩者是有區別的。在使用時應注意以下幾個問題:
1. 字串指標變數本身是一個變數,用於存放字串的首地址。而字串本身是存放在以該首地址為首的一塊連續的記憶體空間中並以‘\0’作為串的結束。字元陣列是由於若干個陣列元素組成的,它可用來存放整個字串。
2. 對字串指標方式
char *ps="C Language";
可以寫為:
char *ps;
ps="C Language";
而對陣列方式:
static char st[]={"C Language"};
不能寫為:
char st[20];
st={"C Language"};
而只能對字元陣列的各元素逐個賦值。
從以上幾點可以看出字串指標變數與字元陣列在使用時的區別,同時也可看出使用指標變數更加方便。
當一個指標變數在未取得確定地址前使用是危險的,容易引起錯誤。
一個錯誤的例子,如下:
char *name;
scanf("%s",name);
printf("%s",name);
有的編譯器雖然也能通過,但這是錯誤的,因為是個指標,定義時指向不可用的地址。解決這個問題有兩種方法:用陣列的方法或給字元針針分配記憶體空間的方法。
陣列的方法:
char name[20];
scanf("%s",name);
printf("%s",name);
給字元針針分配記憶體空間的辦法:
char *name;
name=(char*)malloc(50); //此時name已經指向一個剛剛分配的地址空間。
scanf("%s",name);
printf("%s",name);
但是對指標變數直接賦值是可以的。因為C系統對指標變數賦值時要給以確定的地址。
3.int main()
{
char str1[40]="hello world!"; //char *str1="hello world!";
str1[4]='A'; //若str1是指標型的,編譯通過,但執行是此處會段錯誤
printf("%s\n",str1);
return 0;
}
陣列和指標都可以在它們的定義中用字串常量進行初始化,儘管看上去一樣,底層的實現機制卻不相同。
定義指標時,編譯器並不為指標所指向的物件分配空間,它只是分配指標本身的空間,除非在定義的同時賦值給指標一個字串常量進行初始化。例如:下面的定義建立了一個字串常量(為其分配了記憶體):
char *p=”abcdefg”;
注意只有對字串常量才是如此,不能指望為浮點數之類的常量分配空間,如:
float *p=3.14; /*錯誤,無法通過編譯*/
下面結合一個例項談談初始化指標時建立的字串常量與陣列中的字串的區別:
- 在ANSI C中,初始化指標時所建立的字串常量被定義為只讀。如果試圖通過指標修改這個字串的值,程式就會出現未定義的行為。在有些編譯器中,字串常量被存放在只允許讀取的文字段中,以防止它被修改。
- 陣列也可以用字串常量進行初始化:
Char a[]=”abcdefg”;
與指標相反,由字串常量初始化的陣列是可以修改的。其中的單個字元在以後可以改變。
下面是一個在vc6中的一個例子,完成將一個字串中的所有大寫字母全部轉換為小寫字母的功能:
#include<iostream.h>
#include<ctype.h>
/******************************************************************************/
/*
* Convert a string to lower case
*/
int strlower(char *string)
{
if(string==NULL)
{
return -1;
}
while(*string)
{
if(isupper(*string))
*string=tolower(*string);
string++;
}
*string='\0';
return 0;
}
/*char *strlower(char *string)
{
char *s;
if (string == NULL) {
return NULL;
}
s = string;
while (*s) {
if (isupper(*s)) {
*s = (char) tolower(*s);
}
s++;
}
*s = '\0';
return string;
}
*/
void main()
{
char *test="ABCDEFGhijklmN";
strlower(test);
cout<<test<<endl;
}
其中,如果採用char *test=”ABCDEFGhijklmN”;會產生執行時錯誤。Char test[]=”ABCDEFGhijklmN”則程式正常執行,原因如前所述。
相關文章
- 字元陣列與字串字元陣列字串
- 指標常量和常量指標的區別指標
- 指標陣列練習排列字串指標陣列字串
- Golang 學習——陣列指標和指標陣列的區別Golang陣列指標
- C語言指標(三):陣列指標和字串指標C語言指標陣列字串
- sizeof和strlen計算陣列型別和指標型別字串陣列型別指標字串
- 陣列地址與指標之間的區別與聯絡陣列指標
- 指標陣列與陣列指標指標陣列
- C語言 第 7 節 如何將字串指標指向的內容賦值給陣列C語言字串指標賦值陣列
- 指標陣列和陣列指標與二維陣列指標陣列
- LeetCodet探索——陣列與字串LeetCode陣列字串
- Go 陣列指標(指向陣列的指標)Go陣列指標
- Java如何將字串轉換為字元陣列?Java字串字元陣列
- 字串指標的輸出字串指標
- 陣列指標,指標陣列陣列指標
- json 物件與json 字串的區別。JSON物件字串
- 字串大小的不同求法與區別字串
- C++語言程式設計筆記 - 第6章 - 陣列、指標與字串C++程式設計筆記陣列指標字串
- PHP獲取字串中的某個字元:採用陣列的方式PHP字串字元陣列
- 獲取C/C++字串、字元陣列長度C++字串字元陣列
- 2.刪除字串中的某個字元。(藉助字元陣列實現)字串字元陣列
- 字串不能以指定字元開頭字串字元
- 陣列和字串陣列字串
- String字串,陣列字串陣列
- 陣列與字串方法與相互轉換陣列字串
- Go: 指標方法與值方法<->指標型別與值型別Go指標型別
- 劍指Offer 表示數值的字串字串
- golang中 值型別,指標,引用的區別Golang型別指標
- JAVA虛擬機器-方法區與字串常量池Java虛擬機字串
- 字串常量池字串
- C++陣列 字串C++陣列字串
- 二維陣列與指標陣列指標
- PHP二維陣列切割為字串並去除重複的值PHP陣列字串
- 物件陣列與一般陣列的區別物件陣列
- 力扣之反轉字串之原地修改輸入陣列(雙指標方式)力扣字串陣列指標
- C語言知識彙總 | 51-C語言字串指標(指向字串的指標)C語言字串指標
- 字串和字元的操作字串字元
- 資訊學奧賽複賽複習01-CSP-J2019-01-字元、字元陣列、字串、string、字串讀取字元陣列字串