指標破壞陣列

2021-05-23 01:35:21 字數 1334 閱讀 2625

多日沒法部落格,最近沒什麼進展,剛畢業事情多,重新溫習了下c的基礎,看到乙個指標操作破壞陣列的例子,百思不解,通過跟蹤除錯,終於有了自己的理解,原來是被指標的外衣所迷惑了,基礎還是不行啊,還得多看,閒話不說,上例子。

版本一:

int findchar(char **strings, char value) }

return false;}

版本二:

int findchar(char **strings, char value) }

strings++;}

return false;}

以上兩個函式的版本都是在陣列中尋找對應的字元現在做下簡單的分析:

拆分一下標記

1和標記

2的分別做的工作:標記1

:strings

是乙個指向指標的指標該指標存放的是乙個指標

操作先拷貝乙份

strings

的指標將它賦值給我們定義的指標變數

string,

然後將指標

+1,使得

strings

指向下個指標,假設這個指標存放的內容是指向

」hello」

字串首位址的指標。然後對這個位址的操作就留給我們定義的區域性指標變數

string

來操作,原陣列仍然儲存指向這個字串首位址的指標。

標記二:先對求得當前指標所儲存的字串的指標,然後將位址進行了

+1操作使它指向下個乙個字元位址比如

」hello」

,則操作完成後位址變成指向

」ello」

,然後依次迴圈到末尾,然後通過

strings++

,指向下乙個指標,此時,前乙個指標的值已經被修改。因此第二個版本做完依次操作後就無法再次進行查詢,因為指標陣列中儲存的指標已經被修改了。而第乙個版本中,在做比較操作時,將指標陣列中儲存的指標值,放到另外乙個指標變數中去做操作,因此沒有被破壞。

其實整個操作過程類似於簡單的變數操作的區別

,為了直觀的表示它們的區別我做個簡化解釋:

版本一:

int p = 1;

int b = p;

++b; 此時

b的值被改變了,而

p仍然儲存原先的值沒被修改,版本一正是這麼做的,只是我們這邊是整型變數,而他操作的是指標變數而已。

版本二:

int p = 1;

++p;

直接將p儲存的值進行自增操作,改變了

p本身的值,版本二中,就是直接對所儲存的字串指標值,進行了自增,導致執行後本身陣列的值被修改,範例用的是整型變數,而函式中操作得值其實是指標,換湯不換藥而已,無法理解其實是被指標的外衣所迷惑了。

指標基礎知識 ,破壞指標陣列的討論,

int a a 12 a 未被初始化,不知道指向 有,可能指向乙個合法位址,把12儲存到a所指的記憶體位置,可能就篡改乙個合法的值。它是乙個特殊的指標,表示不指向任何東西。使乙個指標變數為null,可以賦乙個零值。但是需要注意的是,對乙個null指標解引用是非法的,所以在對指標解引用之前要確定它非乙...

樹狀陣列2(破壞公路)

題目描述 在太平洋中心有乙個圓形小島,沿著小島的海岸線分布著 n個小鎮,編號分別為 1,2,3 n 小鎮i 1 小鎮i 小鎮i 1 是相鄰的 當然小鎮 n與小鎮 1相鄰 相鄰小鎮之間存在一條公路,公路也有編號,公路 i連線小鎮 i和小鎮 i 1,公路 n連線小鎮 n和小鎮 1.現在對小島有 m個操作...

陣列,指標,指標陣列,陣列指標

指標是在32位系統下佔四個位元組,64位系統下佔八個位元組的一種型別,指標指向的內容可以是常量,變數,函式,結構體,指標本身,陣列,等等.一級指標 一級指標常常在函式傳參時使用,可傳的引數有一維陣列,常量指標,函式指標等等都可以 但我們要注意不要在函式中,通過改變形參的指向來達到改變實參指向的效果,...