本文原創,僅發布於博客園,如在其他網站看見均為盜取
今天學校有計算機拓展課,抽出時間來寫一篇關於指針的文章。
指針我之前已經寫過五篇文章了,這一篇還是一樣,來講指針。指針是C++中非常值得研究的知識點。因此,想要把指針學好,是不容易的。
前言
今天學校里面看見有人問我一個問題,說是字符串比較的問題。
char s[10];
...
if(s=="123456789")...
沒有語法錯誤,但是運行結果不太對。
大家可以在這個地方停一停,想想是為什么。
字符串比較strcmp
我們之前的文章應該講過,如果沒講過或是不記得了,我們就再重新說一遍。
指針的比較
請在這里允許我摘錄《征服C指針》的一段話:
1.1.8 C是只能使用標量的語言
對於標量(scalar)這個詞,大家可能有些陌生。
簡單地說,標量就是指 char、int、double 和枚舉型等數值類型,以及指針。相對地,像數組、結構體和共用體這樣的將多個標量進行組合的類型,我們稱之為聚合類型(aggregate)。
早期的 C 語言一度只能使用標量。
經常聽到初學者有以下的提問:
if (str == "abc")
這樣的代碼為什么不能執行預期的動作呢?確實已經將“abc”放到了 str 中,條件表達式的值卻不為真。這是為什么?
對於這樣的疑問,通常給出的答案是“這個表達式不是在比較字符串的內容,它只是在比較指針”,其實還可以給出另外一個答案:
字符串其實就是 char 類型的數組,也就是說它不是標量,當然在 C 里面不能用==進行比較了。
上面的解釋應該是比較完善的。
在表達式中,數組如果后面不帶[],就會在表達式中解釋做指針。因此,在這里,數組名str會被解釋做str的地址。
而我們的字符串常量,例如"abc",在表達式中也會解釋做指針。實質上,這個東西本質是數組,我們來做一個簡短的實驗:
#include<bits/stdc++.h>
using namespace std;
char str[3];
int main(){
printf("%p\n",str);
printf("%p\n","abc");
printf("%d\n",sizeof("abc"));
}
根據sizeof的結果,我們可以發現字符串常量的本質是數組而不是指針。(詳細請見之前的文章,數組和指針的sizeof結果是不同的)
而str和"abc"的地址是截然不同的,因此,比較的結果一定不會相等。
strcmp
很多字符串處理的函數都包含在<string.h>中。
strcmp用於比較字符串的大小,返回值如下:
strcmp(a,b)
a=b 返回0
a<b 返回負數
a>b 返回正數
對於部分處理環境,a<b返回-1,a>b返回1,但是如果僅僅對1和-1判斷,在部分環境還是過不去的。
strcmp的本質還是指針運算。我們舉個例子,代碼來源網上:
int strcmp(const char *src,const char *dst){
int ret=0;
while(!(ret = *src - *dst) && *dst)
++src,++dst;
return ret;
}
代碼其實比較復雜。由於用到了指針運算。指針運算其實比較復雜和靈活,我們解釋while語句的指針運算。
src-dst表示比較結果,如果比較字符不相等,就會直接退出語句。而*dst表示比較的字符是否為'\0'。
strcpy
由於數組是不可變的,因此,執行str="abc"一類的語句是不對的。
我們需要使用strcpy來實現。
