指標 解決的疑惑

2021-09-08 15:05:09 字數 2958 閱讀 1204

簡單的就不說了,今天學鍊錶,在鍊錶中遇到了自己疑惑的事情,後來在網上查二級指標,搜出來乙個,才解除了自己的疑惑

好久沒有用過c/c++的二級指標了,總覺的它就是指標的指標,沒什麼大不了的,但是今天看到一道面試題,感覺自己對二級指標的理解還是不夠深刻。於是,從網上找資料,學習了一番……

題目是這樣的:

#include "

stdafx.h

"#include

using

namespace

std;

void getmemory(char *p, int

num)

int main(int argc, _tchar*ar**)

問:程式能否達到目的:在getmemory()中為main函式中的開闢空間,並將str指向這段空間?

分析:str是乙個指標,指向null,形參p也是乙個指標,初始也指向null,在getmemory函式中,這個指標又指向了新開闢的空間。但是只是形參的指向改變了,實參str仍然指向null,並沒有改變。因此,程式達不到題目的要求,而且執行時會出現錯誤,由於str一直指向null,執行strcop時,會出現錯誤,提示某某記憶體不能寫入。

正確的方法應該採用雙指標,程式如下:

#include "

stdafx.h

"#include

using

namespace

std;

void getmeory(char **p, int

num)

int _tmain(int argc, _tchar*ar**)

分析:str是乙個指標,指向null。而呼叫getmemory函式時,傳遞的是str的位址,p是乙個二級指標,*p是乙個指標。因此,將str的位址賦給臨時變數p,則*p就是指標str的值,改變*p的值就相當於改變str的值。因此這種方法能夠得到題目要求的效果。另外還有一種方法,採用一級指標,讓函式返回乙個指標變數,指向新分配的記憶體,程式如下:

#include "

stdafx.h

"#include

using

namespace

std;

char * getmeory2(char *p, int

num)

int _tmain(int argc, _tchar*ar**)

2. 另外用二級指標還經常用在動態申請二維陣列。

void

main()

這樣就實現了二維陣列的動態申請,因為一般陣列宣告時,不允許下標是變數,所以如果想動態決定陣列各維的大小,最好這樣做。

關於那個面試題,,,我也掛了,看後才有所警覺

下面看我的關於鍊錶的

struct

mystruct

;typedef

struct

mystruct st;

void add(st **p, int inum, float icore)//

傳入頭結點位址,插入資料

else

//鍊錶不為空

//退出迴圈說明找到了最後乙個節點pp

st *last ;//

建立結構體指標

last = (st *)malloc(sizeof(st));//

分配空間

pp->pnext =last;

last->corse =icore;

last->num =inum;

last->pnext =null;

}}void

main()

我列印了一下

add(&pfast, 1, 1);//傳入頭結點位址,插入資料

經過這一句pfast的指向當然是fast

我一直在懷疑

add(&pfast, 2, 2);//傳入頭結點位址,插入資料

經過這一句pfast的指向應該是last

所以我懷疑

printf("%d,%f\n",pfast->pnext->num,pfast->pnext->corse);

這一句應該會報錯

因為

我感覺如果pfast的指向永遠指向最後乙個鍊錶那麼
pfast->pnext->num

就不存在

可是我一列印,,,

pfast確實指向了第乙個鍊錶

可是接著

add(&pfast, 2, 2);//傳入頭結點位址,插入資料

只是把第乙個鍊錶的位址賦值給了pp,,但是並沒有改變*p的指向

下面的pp->pnext = last;只是給pp賦了新值

就如同

#include"

指標使用的疑惑

test1.c include include include include char b abcdefg void change char char str int main int argc,char argv gcc test1.c o test1 執行結果 str abcdefg a nu...

指標與陣列的疑惑

include void reverse string char string void swap char a,char b intmain void void reverse string char string 若char string fucnkjljlk 換成 char string fu...

JSP 疑惑解決筆記

1 jsp兩種include的區別 include file 是把引入的檔案和當前的檔案合成乙個servlet檔案進行解析。是把當前檔案和引入檔案生成兩個不同的servlet檔案,在當前檔案中在進行動態的呼叫引入的servlet檔案。2 和重定向區別 是伺服器行為,瀏覽器只做了一次訪問請求,傳輸的資...