函数形参和实参问题

2015-01-27 14:03:16 · 作者: · 浏览: 14

今天闲着没事实现了一下数据结构里面的顺序表,在顺表初始创建的时候遇到了这样一个问题。


#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;i
    
     length;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.2cto.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;i data[i]=a[i]; L->length=n; } void dispList(SqList *L){ if(isListEmpty(L)) return; for(int i=0;i length;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函数可以正常运行了。