程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> 函數形參和實參問題

函數形參和實參問題

編輯:C++入門知識

函數形參和實參問題


今天閒著沒事實現了一下數據結構裡面的順序表,在順表初始創建的時候遇到了這樣一個問題。


#include
#include
#define MaxSize 1000
#define ElemType int



typedef struct 
{
	ElemType data[MaxSize];
	int length; 
}SqList;


int isListEmpty(SqList *L);

int  *p;

void CreateList(SqList *LTMP,ElemType a[],int n){
	printf("%p ",LTMP);
	LTMP=(SqList *)malloc(sizeof(SqList));
	printf("%p ",LTMP);
	p=(int *)LTMP;
	printf("%p\n",p); 
	for(int i=0;ilength;i++){
		printf("%d ",L->data[i]);
	} 
	printf("\n");	
}

int isListEmpty(SqList *L){
	return(L->length==0);
}
int main()
{	
	int a[3]={1,2,3};
	SqList * L=NULL;
	printf("%p ",L);
	CreateList(L,a,3);
	printf("%d %d %d \n",*p,*(p+1),*(p+2));
	printf("%p\n",L); 
	//dispList(L);	
}

當你在CreateList(SqList *L,ElemType a[],int n)裡,不對L加上&(引用符)將會導致dispList函數報錯,原因是這裡的CreateList函數裡L傳遞的是形參,CreateList函數的L指針是一個臨時指針,設為LTMP。哪怕是指針,沒有引用符,傳遞的也是形參,L是兩個指針。

\

第一個地址表示實參L的地址,因為L為NULL,所以地址為0地址。第二個地址為L的傳遞給CreateList函數的形式參數,LTMP一樣指向NULL,同樣為0地址。<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+tdrI/bj2tdjWt9PJ09q4+ExUTVC31sXkwcvQwrXExNq05r/VvOSjrNa4z/JtYWxsb2O/qrHZtcTSu7bOtq/MrMTatOajrMrXtdjWt86qMDAwLi4uMDAzMzcwMDCjrLXay8S49rXY1rfKx8irvtax5MG/1rjV61DWuM/yTFRNULXEtdjWt6Os0rLOqjAwMC4uLjAwMzM3MDAwoaO1q8rHtbG6r8r91MvQ0L3hyvi686OstffTw7qvyv3Vu86qv9WjrMHZyrGx5MG/0rKxu8rNt8WjrMTHts7E2rTm0rvWscO709Cxu8rNt8WhozwvcD4KPHA+uvPD5tPDKnAsKihwJiM0MzsxKaOsKihwJiM0MzsyKcrks/YxLDIsM6OsvLTU2kNyZWF0ZUxpc3S4s7XEJiMyMDU0MDujrMTHts7E2rTm0rvWscO709DKzbfFwcujrMDvw+a05rXEyv2+3dKyw7vT0LjEseSjrMjnufvDu9PQxNq05ta7z+vL/KOsvs274bP2z9bE2rTm0LnCtqGjPC9wPgo8cD6688Pm1NnK5LP2TLXEtdjWt6Os08nT2srHJiMyMDU0MDu0q7Xdo6zL+dLUTMO709C4xLHko6zSwL7JyscwtdjWt6GjPC9wPgo8cD48YnI+CjwvcD4KPHA+z8LD5s7Sw8fTwyDS/dPDtKu13cC0v7S/tKGjPC9wPgo8cD48cHJlIGNsYXNzPQ=="brush:java;">#include #include #define MaxSize 1000 #define ElemType int typedef struct { ElemType data[MaxSize]; int length; }SqList; int isListEmpty(SqList *L); int *p; void CreateList(SqList *&L,ElemType a[],int n){ printf("%p ",L); L=(SqList *)malloc(sizeof(SqList)); printf("%p ",L); p=(int *)L; printf("%p\n",p); for(int i=0;idata[i]=a[i]; L->length=n; } void dispList(SqList *L){ if(isListEmpty(L)) return; for(int i=0;ilength;i++){ printf("%d ",L->data[i]); } printf("\n"); } int isListEmpty(SqList *L){ return(L->length==0); } int main() { int a[3]={1,2,3}; SqList * L=NULL; printf("%p ",L); CreateList(L,a,3); printf("%d %d %d \n",*p,*(p+1),*(p+2)); printf("%p\n",L); dispList(L); }

第一二個地址都是L的地址,沒有變化,所以依舊是0地址。後面用malloc函數傳給動態分配內存的首地址,並且由於傳遞了L的實參,L發生了改變,所以三四五地址同為新分配的地址。dispList函數可以正常運行了。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved