关于函数传引用和传指针的见解,以线性表为例子

来源:互联网 发布:字幕打轴软件 编辑:程序博客网 时间:2024/06/09 22:38

一个函数包括返回类型,形参。函数总是会为传进来的实参创立一个副本,尽量不对原来的实参做改变。而以引用和指针类型作为新参则需另当别论。


1.形参为引用类型(我看过关于引用的定义最直白就是,就是变量本身,只不过是多了个名字而已,当然对其中任何一个名字去改变,会影响所有值改变)

typedef struct {Elemtype data[MAXSIZE];int length;}List;bool InitList(List &L){L.length=0;return OK;}bool listInsert(List &L,int i,Elemtype e){int k;if (L.length==MAXSIZE) return ERROR;if(i<0||i>L.length+1) return ERROR;if (i<L.length){for (k=L.length-1;k>=i;--k)L.data[k+1]=L.data[k];}L.data[i]=e;L.length++;return OK;}int main(){List LA;List LB;List LC;InitList(LA);InitList(LB);listInsert(LA,0,2);listInsert(LA,1,3);listInsert(LA,2,5);listInsert(LA,3,7);listInsert(LA,4,8);listInsert(LA,5,9);listInsert(LB,0,1);listInsert(LB,1,7);LA.length=6;LB.length=2;}
形参类型为引用,在函数的任何修改将直接对实参本身做修改。



2.形参类型为指针(指针即某个内存块的地址,在32位机中,sizeof(int*)=sizeof(char*)=sizeof(int)=4个字节)

typedef struct LNode{Elemtype data;struct LNode* next;//下一个节点的地址}LNode,LinkList;//LinkList*是指向节点的指针类型,这里是指向头结点的指针类型()void createListHead(LinkList* _copy,int n){LinkList* p;int i;srand(time(0));_copy=(LinkList*)malloc(sizeof(LNode));_copy->next=NULL;for (i = 0; i < n; ++i){p=(LinkList*)malloc(sizeof(LNode));p->data=rand()%100+1;p->next=_copy->next;_copy->next=p;}}int main(){LinkList*  L;L=(LinkList*)malloc(sizeof(LNode));//初始化L,L=00247c58,即L指向的头节点的地址为00247c58createListHead(L,3);int j=1;LNode* p=L;while(j<=3){p=p->next;++j;cout<<p->data<<endl;}int c=sizeof(int);if(sizeof(int*)==sizeof(char*)){cout<<"fuck";}system("pause");}

调用createListHead函数时,创建了一个副本_copy=L=00247c58,
而执行_copy=(LinkList*)malloc(sizeof(LNode));之后_copy为另一个地址00246c89,指向另一个头节点,并且对该地址进行操作,最好退出函数时,_copy销毁,而L指向的头结点没有进行任何操作,所有若注释掉上面一句,则_copy和L的值都为00247c58,所以是对同一块内存操作,对其解引用都会直接作用在main函数里申请的内存区域!



0 0
原创粉丝点击