之前有個粉絲問了我一些問題,聊天截圖如下
他的**是這個樣子的
void
pop(mazestack* s, mselemtype e)
一些不必要的**我省略了,大意就是通過傳參獲取棧頂元素,然後一直拿不到資料。
這種錯誤我想如果不熟悉c語言的新手都會犯,基礎不牢地動山搖
我們c語言學指標那一章都先學swap函式實現交換兩個變數的值的功能,你還記得嗎?
void
swap
(int
*a,int
*b)
在函式體內交換兩個變數的值為什麼要傳指標?
因為函式呼叫傳遞實參,函式體內通過形參拷貝實參資料,並且形參只在函式體內存在,出了函式就被釋放掉了
那麼同樣的道理,你傳個變數就想獲取棧頂元素無異於痴人說夢,解決辦法當然是傳指標咯
那麼關於指標傳參這一塊,又有講究,那麼從一道面試題講起…
先看題,題目很簡單,但是你知道答案嗎?
/*
** 修改程式, 使得程式正常輸出 1234567890 **/
#include
#include
#include
void
(char
* p)
intmain()
現在我們有了前面的指標鋪墊,那麼你能正確修改程式嗎?
我非常明確的告訴你不只是更改申請記憶體的大小為11(』\0』需要乙個位元組)
這個時候你可能就會想起函式裡面申請一塊記憶體之後需要通過返回值返回申請記憶體位址
修改1:
#include
#include
#include
char*(
)int
main()
嗯,沒問題,正確列印1234567890
那麼這個時候面試官又問了,如果不通過函式返回值,你可不可以拿到申請的記憶體位址?
思考良久,懷疑人生,情緒奔潰…
其實很簡單嘛,你把*p
當成乙個值,那麼像交換函式一樣,傳遞這個值的指標,問題不就解決了嗎?
這個時候一直無人問津的二級指標跳了出來,你知不知道,我很重要
。
修改2:
#include
#include
#include
void
(char
** p)
intmain()
當然,我這裡少了個判斷p是否為空,但是這不重要,重要的是這個過程你明白了嗎?
如果你覺得你這個理解到位了,那麼你可以試著完成一下我之前發布的圖書資訊管理系統,裡面都是這個操作
/*刪除節點*/
intderoy_list_delete
(deroy_list_t*
* list_head,
int num)
current =
(*list_head)
->head;
while
(counter < num)
if(counter ==1)
if((*list_head)
->limit_size == counter)
tmp = current;
current->prev->next = current->next;
current->next->prev = current->prev;
free
(tmp)
; tmp =
null;(
*list_head)
->limit_size--
;return0;
}
貼點**,有興趣去看看 二級指標使用舉例
一 無法把指標變數本身傳遞給乙個函式 函式實參接收的實際是乙個指標變數 p 的複製,如p copy,而非指標變數本事,通過p copy可以改變p指向的變數的值,而不能改變p本身的值。eg 參考c語言深度解析4.6.2.2 include include void getmemory char p,i...
二級指標的使用
有時候,我們需要在函式體的內部申請記憶體空間並初始化,然後將內部申請的儲存空間交付給外部指標來引用,這時候,我們可以使用二級指標作為申請空間的函式的引數來實現。main.c檔案 include include include pragma pack push,1 typedef struct use...
為什麼使用二級指標
設計乙個函式 void find1 char array,char search,char pa 要求 這個函式引數中的陣列array是以 0值為結束的字串,要求在字串array中查詢與引數search給出的字元相同的字元。如果找到,通過第三個引數 pa 返回array字串中首先碰到的字元的位址。如...