传值方式

前言

Status InitList_Sq(SqList &L) {
	//构造一个空的线性表L。
	L.elem = (ElemType *)malloc(LIST_INIT_SIZE* sizeof(ElemType));
	if(!L.elem)exit(OVERFLOW);
	L.length=0;
	L.listsize=LIST_INIT_SIZE;
	return OK;
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

Status GetElem(SqList L,int i,ElemType &e)   //这根本就不是取地址符

这样整个倒是显得非常奇怪

那么我们类比这样的形式

int *a,*b; /* 定义了两个整型的指针 */
int **a, **b; /* 定义了整型指针的指针 */
//那么难道说是定义了整型变量为地址的变量e
int &e;

那么我们看下面他写的这个东西:

在数据结构与算法中 传值方式(C语言)-LMLPHP

C/C++中的引用参数

请看下面的例子

1.1 实参值不变

把实参的值传送给函数局部工作区相应的副本中,函数使用这个副本执行必要的功能。函数修改的是副本的值,实参的值不变。

#include <stdio.h>
void swap(float m,float n)
{
    float temp;
    temp = m;
    m = n;
    n = temp;
}
void main()
{
    float a,b;
    printf ("please enter the number of a and b =");
    scanf("%f %f",&a,&b);
    swap (a,b);
    printf ("the number of a = %f, the number of b = %f",a,b);
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

可以看到,a与b的值并没有发生更换。

1.2传地址方式——指针变量做参数,形参变化影响实参

#include <stdio.h>
void swap(float *m,float *n)
{
    float temp;
    temp = *m;      //取指针变量内容
    *m = *n;
    *n = temp;1
}
void main()
{
    float a,b,*p1,*p2;
    printf ("please enter the number of a and b =");
    scanf("%f %f",&a,&b);
    p1=&a;
    p2=&b;
    swap (p1,p2);
    printf ("the number of a = %f, the number of b = %f",a,b);
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

#include <stdio.h>
// 利用指针的经典解法
void swap(int *a, int *b)
{
    int temp;
    temp = *a;
    *a = *b;
    *b = temp;
}

void main()
{
    int a = 1, b = 2;
    swap(&a,&b);
    printf("%d %d",a,b);
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

可以看到,

在数据结构与算法中 传值方式(C语言)-LMLPHP

形参变化不影响实参

#include <stdio.h>
void swap(float *a, float *b)
{
    float *temp;
    temp = a;
    a = b;
    b = temp;
}

void main()
{
    float a = 1, b = 2;
    swap(&a,&b);
    printf("%f %f",a,b);
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

在数据结构与算法中 传值方式(C语言)-LMLPHP

1.4 传地址方式——数组名作参数

传递的是数组的首地址

#include <stdio.h>
#include <string.h>
void sub(char *b)   //在C++语言中也可以使用b[]来写
{
    strcpy(b,"world");
}
void main()
{
    char a[10] = "hello";
    sub(a);  //传数组首地址
    printf("%s",a);
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

1.5 传地址方式——引用类型做参数

什么是引用?

//运用了C++的语法
#include <iostream>
#include <stdio.h>
// 引用参数实现交换
void swap(int &a, int &b){
    int temp;
    temp = a;
    a = b;
    b = temp;
}

// Using main to test
int main(){
	int a = 1, b = 2;
    swap(a,b);
    printf("%d %d\n",a,b);
    return 0;
}

在数据结构与算法中 传值方式(C语言)-LMLPHP

可以参考1.2 传地址方式——指针变量做参数,形参变化影响实参

SqList *&L的情况

它的意思是,L是对List的引用,函数体内对L的操作,就相当于对Head的操作,所以这种情况下对L的更改才会发生到List上。

SqList *L的情况

当List指针作为函数参数传进去时,意为你要把指针List所指的地址值赋给指针L,(可以类比int类型,毕竟指针本质上也是一种数据类型)。这就意味着此时的实参List跟形参L并不是同一个指针,而是指向同一个地址的不同指针。所以你对L的操作并没有发生到List身上。达不到预期效果。

最后

03-19 22:01