上一篇寫了結構產生的原因以及一些常識的結論,一般來說,常用的知識點就是這些,基本夠用,但有時也容易產生一些小錯誤,這篇簡單寫下, 主要面向初學者。
傳指針的小問題在C語言中,函數傳參都是傳值。有同學表示反對:書上是這么說的,可以傳值,也可以傳引用(地址)。其實是,兩者都是傳值。
比如
void test_pointer(int *p){ printf("%d
",*p);}int main(int argc, char* argv[]){ int a=10; test_pointer(&a); //傳地址 return 0;}
調用test_pointer函數時,將a的地址傳過去,我們知道地址是一個固定長度的4字節整數值(以VC6.0環境為例),test_pointer的函數棧中也會準備4字節來存放這個值,因此是傳值。如下圖所示:
如圖所示,相當于將a的地址值0x0019fecc傳過去,那么函數棧中也就有了一份地址數據。因此,結論是:傳地址也只是傳值。
有地址只能讀不能修改這句話主要針對動態分配來說的,有一個指針p1傳過去,賦值給參數p2,相當于有兩個地址,且p1=p2。如果在函數內部進行malloc分配,并賦值給p2,但p1并未改變,只是因為兩者都只是4字節大小的普通值。代碼如下:
void test_pointer(char *p2){ //p2變化了 p2=(char*)malloc(100);}int main(int argc, char* argv[]){ char *p1; test_pointer(p1); return 0;}
那么怎么辦呢?只能將函數參數改為指向指針的指針。代碼如下:
void test_pointer(char* *p2){ //*p2就是p1的值 *p2=(char*)malloc(100);}int main(int argc, char* argv[]){ char *p1; test_pointer(&p1); printf("%p
",p1); return 0;}
【分析】對于熟練的程序員來說不是一個問題,但對于初學者來說,是一個比較隱諱的錯誤。指向指針的指針比較麻煩一些,在C++中通過引用解決這個問題,代碼如下:
void test_pointer(char* &p2){ //引用之后p2就是p1 p2=(char*)malloc(100); p2[0]='a';}int main(int argc, char* argv[]){ char* p1; test_pointer(p1); printf("%c
",p1[0]); // 'a' return 0;}
但是覺得代碼還是不夠清晰,使用typedef將類型包裝一下,得到下面的樣式:
typedef char* POINTER;void test_pointer(POINTER &p2){ //引用之后p2就是p1 p2=(POINTER)malloc(100); p2[0]='a';}int main(int argc, char* argv[]){ POINTER p1; test_pointer(p1); printf("%p
",p1); printf("%c
",p1[0]); return 0;}
經過這幾步就將程序包裝清楚了,下面到主題:結構體
二叉樹的創建在《數據結構 算法分析與實現》書中講到二叉樹創建時,就運用了上面了這個模型,概括下就是:有一個指針值p當前是空的,傳入函數之后,想通過動態分配讓這個p得到值,那么我們設計形參時,要么傳指向指針的指針,要么用C++模式傳引用。下面是C++傳引用的形式:
/* @C++傳引用版本 @功能:創建二叉樹*///二叉樹結構定義typedef struct BiTNode{ char data; BiTNode *lchild,*rchild;}BiTNode,*BiTree;//創建二叉樹//使用引用時,形參的T就等于實參的T,無縫銜接void CreateBiTree(BiTree &T){ char ch; scanf("%c",&ch); if(ch== ' ') T=NULL; el{ T=(BiTree)malloc(sizeof(BiTNode)); if(!T) exit(-1); T->data=ch; CreateBiTree(T->lchild); CreateBiTree(T->rchild); }}int main(int argc, char* argv[]){ //定義二叉樹頭指針 BiTree T; CreateBiTree(T); //輸入:ab c ↘ //b后兩個空格,c后兩個空格,然后回車 return 0;}
最后,我們再看下C語言版本的
//結構定義typedef struct BiTNode{ char data; BiTNode *lchild,*rchild;}BiTNode,*BiTree;void CreateBiTree(BiTree *T){ char ch; scanf("%c",&ch); if(ch== ' ') *T=NULL; el{ *T=(BiTree)malloc(sizeof(BiTNode)); if(!T) exit(-1); (*T)->data=ch; CreateBiTree(&((*T)->lchild)); CreateBiTree(&((*T)->rchild)); }}int main(int argc, char* argv[]){ //定義二叉樹頭指針 BiTree T; CreateBiTree(&T); //輸入:ab c ↘ //b后兩個空格,c后兩個空格,然后回車 return 0;}
【分析】可以看出使用C++引用更清晰一些
結語通過幾個小例子說明了指針的使用方式,并寫了一個關于結構體的問題。問題不是很難,但是需要謹小慎微。
如果文章的意思都能理解,那么在結構體的使用上基本不會有太大的問題!
本文發布于:2023-02-28 21:04:00,感謝您對本站的認可!
本文鏈接:http://www.newhan.cn/zhishi/a/1677722748102424.html
版權聲明:本站內容均來自互聯網,僅供演示用,請勿用于商業和其他非法用途。如果侵犯了您的權益請與我們聯系,我們將在24小時內刪除。
本文word下載地址:vc6.0英文版(vc6.0英文版安裝教程).doc
本文 PDF 下載地址:vc6.0英文版(vc6.0英文版安裝教程).pdf
| 留言與評論(共有 0 條評論) |
|