字符串翻轉(zhuǎn)

字符串翻轉(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)存空間。

截屏2020-01-13上午10.57.00.png

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


截屏2020-01-13上午10.57.08.png

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

截屏2020-01-13上午10.57.13.png

指針是通過間接引用的方式來修改變量。首先將變量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é)。

截屏2020-01-13下午2.31.23.png

截屏2020-01-13下午2.31.53.png

這是在內(nèi)存中的真實(shí)排布情況,

//begin 和 end 都是指針。指針比較是地址前后的比較。由于數(shù)組開批出來的空間是一段連續(xù)的內(nèi)存地址。
//所以可以根據(jù)內(nèi)存地址來進(jìn)行比較大小
  while (begin < end) 
        char temp = *begin;
        *(begin++) = *end;
        *(end--) = (temp);
截屏2020-01-13下午3.40.36.png

第一次:

  • 指針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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容