字符串翻轉(zhuǎn)
要求:
給定字符串“hello,world”,實(shí)現(xiàn)將其反轉(zhuǎn)。
輸出結(jié)果:"dlrow,olleh"
-思路:
begin指針指向第一個字符;
end指針指向最后一個字符;
交換兩個指針的內(nèi)容,begin指針向后移動一位、end指針向前移動一位,交互下一對;
void char_reverse(char* cha)
{
// 指向第一個字符
char* begin = cha;
// 指向最后一個字符
char* end = cha + strlen(cha) - 1;
while (begin < end) {
// 交換前后兩個字符,同時移動指針
char temp = *begin;
*(begin++) = *end;
*(end--) = temp;
}
}
調(diào)用:
//字符串?dāng)?shù)組
char ch[] = "hello,world";/*char * ch = "hello,world"; 不可以*/
char_reverse(ch);
printf(ch);
解析:
1.指針
什么是指針?
指針就是存放變量的變量。
//1.定義一個指針p
int *p;
//2.定義int類型的變量a,并賦值
int a = 20;
//3.將變量a的地址值給指針P
p = &a;
在內(nèi)存中大概的分布以及順序是這樣
(在16位編譯器環(huán)境下,一個指針變量占用2個字節(jié),int也占用2個字節(jié))
1.定義一個指針p,系統(tǒng)自動給指針變量開辟了一個2字節(jié)內(nèi)存空間。

2.系統(tǒng)自動給變量a開辟了一個2字節(jié)空間。

3.將變量a的地址值給指針p。

指針是通過間接引用的方式來修改變量。首先將變量a的地址存放在另一個變量中,存放在變量p中,然后通過變量p來間接引用變量a,間接讀寫變量a的值。這就是間接引用
如果通過間接引用的方式來修改a的值,可以這么做:先根據(jù) 變量名p 獲取 變量p 的地址ffc1,取出變量p中存儲的內(nèi)容ffc3,也就是變量a的地址,再根據(jù)變量a的地址ffc3找到a的存儲空間,然后修改里面的數(shù)據(jù)。
2.代碼分析
//指向第一個字符,指針之間的傳遞都是地址值傳遞。將cha指針的里面存儲的地址值給begin
char* begin = cha;
// 指向最后一個字符,cha里面存的是地址,strlen 可以計算出字符長度。
char* end = cha + strlen(cha) - 1;
cha是地址值里面存放的是"hello,world",如(0xffd1),但strlen返回的是數(shù)字,地址+數(shù)字這好像不成立。
系統(tǒng)是這樣做的,會根據(jù)變量的類型進(jìn)行尋址: 地址值(如0xffd1)+ 類型所占內(nèi)存的字節(jié)數(shù) * 變量個數(shù),如int類型是2個字節(jié)(在16位編譯器環(huán)境下),那就是地址值(如0xffd1)+ 2 * (strlen(cha) - 1),char是占用一個字節(jié),所以end = 0xffd1 + 1 *(11 - 1)=0xffdb。
看下編譯器打印,本次是在64位編譯環(huán)境下進(jìn)行的。在64位編譯環(huán)境下,char類型仍然占用一個字節(jié)。


這是在內(nèi)存中的真實(shí)排布情況,
//begin 和 end 都是指針。指針比較是地址前后的比較。由于數(shù)組開批出來的空間是一段連續(xù)的內(nèi)存地址。
//所以可以根據(jù)內(nèi)存地址來進(jìn)行比較大小
while (begin < end)
char temp = *begin;
*(begin++) = *end;
*(end--) = (temp);

第一次:
指針begin中存儲的是地址0x000000010000fa8,地址0x000000010000fa8中存儲的是H。指針中存儲的都是地址。*begin是取出指針begin中存儲的0x000000010000fa8。在賦值的過程中,系統(tǒng)就會根據(jù)地址0x000000010000fa8取出值H,賦值給變量temp。*end(0x000000010000fb2)取出存儲的d賦值給*begin。賦值過程中,系統(tǒng)取出*end(0x000000010000fb2)存儲的d,覆蓋*begin(0x000000010000fa8)中存儲的內(nèi)容H。賦值完成后指針begin + 1。變量
temp存儲的中H賦值給*end。賦值過程中,系統(tǒng)會自動將變量名temp轉(zhuǎn)換為變量的存儲地址,根據(jù)地址找到變量temp的存儲空間取出存儲的H,,覆蓋*end(0x000000010000fb2)中存儲的內(nèi)容d。賦值完成后指針end - 1。
總結(jié):
- 本次算法運(yùn)用到的知識
1.指針。
2.(begin++) 和 ++begin。
3.指針的加減。
文章中若有闡述不當(dāng)之處,歡迎指正。Thanks?(?ω?)?。
參考文章:
https://www.cnblogs.com/mjios/archive/2013/03/16/2963645.html
http://www.itdecent.cn/p/a09a5bd06dcd