其實簡單來說, 如果CreateData()和Print()這二個函數(shù)是正確的, 你只要分別看一下CreateData()和Print()的函數(shù)原型:
十多年的珠海網(wǎng)站建設(shè)經(jīng)驗,針對設(shè)計、前端、開發(fā)、售后、文案、推廣等六對一服務(wù),響應(yīng)快,48小時及時工作處理。全網(wǎng)整合營銷推廣的優(yōu)勢是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動調(diào)整珠海建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計,從而大程度地提升瀏覽體驗。成都創(chuàng)新互聯(lián)公司從事“珠海網(wǎng)站設(shè)計”,“珠海網(wǎng)站推廣”以來,每個客戶項目都認真落實執(zhí)行。
1. int CreateData(Lcountry *head): 它的輸入?yún)?shù)類型是 Lcountry *, 也就是Country **, 而 "head"是Country *型, 所以傳給CreateData時, 應(yīng)該取 head, 也即為 Country **型.
2. void Print(Country* p): 它的輸入?yún)?shù)類型就是Country *, 而 "head"正是Country *型, 所以只要給它傳 "head"就可以.
3. "head"和"head"都是指針, 都是地址, "head"是"*head"的地址, 而"head"是"head"的地址.
你的地址值傳遞錯誤,按照我給你修改的試試看,一定要注意你的實參傳遞的是地址還是具體的值,如果是地址,在子函數(shù)中就不要去修改你傳遞進來的地址。
int
main(void)
{
int
data=0;
//此處隨機分配內(nèi)存空間,不要用指針
myStack=makeStack(myStack,top);
Push(myStack,3);
Push(myStack,8);
Push(myStack,19);
Push(myStack,31);
Push(myStack,43);
Push(myStack,36);
Pop(myStack,data);//此處,傳遞的是地址值
printf("%d
",data);
}
int*
Pop(LinkedStack
myStack,int
*data)
{
pStack
cursor=myStack;
if(Stack_Empty())
{
}
else
{
while(cursor-next!=top)
{
cursor=cursor-next;
}
*data=top-data;
//此處,只是在同一個內(nèi)存空間修改其值,所以不要取地址
top=cursor;
return
data;
}
}
如果你只需要傳出一個值,把這個值放在return后面,
例如 子函數(shù)fun中return p;然后調(diào)用時用 t=fun()就可以了。
如果需要傳回多個值,需要二級指針。
比如fun(int** p){p=0;}
Main()
{ int *q;
fun(q);
}
調(diào)用有q的值就變成0了。
當然由于你說的是將指針傳出,所以p需要是二級指針,如果是一般變量的話,p只需要是一級指針就可以了。
不知下列代碼對你是否有用
記?。篊中只有_值_傳遞!
#include conio.h
#include stdio.h
void fun(int **pp, int *i);
int main(void)
{
int *p, i;
i = 88;
fun(p, i);
printf("%d\n", *p);
getch();
return 0;
}
void fun(int **pp, int *i)
{
*pp = i;
}
或者
#include conio.h
#include stdio.h
#include stdlib.h
#define N 100
void getmemory(int **pp, int n);
int main(void)
{
int *p, i;
getmemory(p, N);
for (i = 0; i N; i++)
p[i] = i;
for (i = 0; i N; i++)
(i+1)%10 ? printf("%3d", p[i]) : printf("%3d\n", p[i]); /*輸出0~99*/
getch();
return 0;
}
void getmemory(int **pp, int n)
{
*pp = (int *)malloc(n * sizeof(int));
}
所謂對應(yīng)其實是參數(shù)形式上的對應(yīng)。上面的兩個函數(shù)都要求傳遞一個指針類型。并且還是雙指針類型。c的編譯器執(zhí)行的是字面上的語義檢查,并不實際追究這個參數(shù)真是子函數(shù)需要的。而你傳遞參數(shù)的正確與否在運行時才能反映出來。尤其是指針,傳遞一個錯誤的指針基本會導致你的程序運行不成功,或者直接終止運行。
上面你的代碼中你給你的子函數(shù)傳遞一個int 類型的值,編譯器肯定會報錯,但是你用顯式類型轉(zhuǎn)換將int轉(zhuǎn)換成雙指針類型就騙過了編譯器。比如這樣:
int test=0x00400000;
shell_sort((char**)test,n);
編譯通過,運行必然出錯。
intcmp是和GetKeyFunc_t對應(yīng)起來的。
而你現(xiàn)在錯在了CmpFunc_t這個函數(shù)參數(shù)上了。
你把怎樣的函數(shù)參數(shù)指針傳給了BST_t *newBST?
你沒交代清楚啊,你把錯誤指針傳給newBST函數(shù)的第一個參數(shù),編譯器肯定報錯了。你給了那么多代碼,關(guān)鍵你把什么傳給了BST_t *newBST的第一個參數(shù)?給一下你調(diào)用這個newBST函數(shù)的代碼,而且要你傳給該函數(shù)第一個參數(shù)的參數(shù)定義。
另外給個建議:定義函數(shù)時,記得對傳進來的參數(shù)進行合法性檢驗。多加幾行代碼是很有必要的,能增強函數(shù)的健壯性。(微軟也好,ISO也好,都對大部分函數(shù)設(shè)計時要求做必要的合法檢驗)
網(wǎng)站名稱:c語言子函數(shù)傳指針出來 C語言函數(shù)傳指針
標題網(wǎng)址:http://muchs.cn/article28/hgejjp.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標簽優(yōu)化、、網(wǎng)站改版、品牌網(wǎng)站制作、外貿(mào)網(wǎng)站建設(shè)、網(wǎng)站建設(shè)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)