函数形参(非引用,指针,引用)

本文详细介绍了函数形参的概念、作用及特点,并通过实例展示了非引用参数、指针形参和引用形参的使用方法。理解这些概念有助于更好地掌握函数调用机制。

形参定义:全称为“形式参数”是在定义函数名和函数体的时候使用的参数,目的是用来接收调用该函数时传递的参数

形参作用:实现主调函数与被调函数之间的联系,通常将函数所处理的数据,影响函数功能的因素或者函数处理的结果作为形参

形参的特点:

1:形参变量只有在被调用时才分配内存单元,在调用结束时,即刻释放所分配的内存单元。因此,形参只在函数内部有效。函数调用结束返回主调用函数后则不能再使用该形参变量

2: 实参和形参在数量上,类型上、顺序上应严格一致,否则就会发生类型不匹配的错误

常用的形参方式:

1:非引用参数

例:

void add(int x1,int x2)
{
	printf("x1+x2=%d\n",(x1+x2));
}

注:这是最常用的形参方式,在函数被调用时,将会分配内存创建实参的副本(拷贝)。请理解采取副本的原因:(参见形参特点2)由于要使得形参只在函数内部有效,所以我们在函数调用时不能直接对保存实参的内存进行直接操作,而是对实参的拷贝进行操作。

2:指针形参

例:

void add(int *x1,int *x2)
{
	printf("(*x1+*x2)=%d\n",(*x1+*x2));//将int型数组x1和x2的首个元素进行相加求和
	*x1=10;//将改变实参的值
}

注:指针形参在函数调用时会创建指针的副本(可以理解为存放指针的变量),所以我们在函数中获得了指向指定数据块(实参)的指针,即可以对该数据块(实参)进行修改。同时由于指针可能指向一个对象或没有任何对象,所以函数在确定指针实际指向一个有效地对象之前不能安全地解引用一个指针

3:引用形参

例1:

void add(int &x1,int &x2)
{
	printf("x1+x2=%d\n",(x1+x2));
	x1=2;//将改变实参的值
	x2=3;//将改变实参的值
}

例2:

void test(char *&fp)
{
	fp="ssssssss";//将改变实参的值
	cout<<"int :"<<fp<<endl;
}

注:引用形参将直接捆绑实参对象,可以理解为实参的别名,对其操作实际就是直接对实参操作。由于应用形参需要和实参对象进行直接的绑定,所以引用必须被初始化为指向一个对象,而且一旦初始化将不能再指向其他对象。

参考文章:

1:函数的形参(非引用形参、指针形参、引用形参)

2:【C++基础学习】C++引用参数与指针参数






在C语言中,只有指针可以作为函数形参,C语言本身没有引用的概念,引用是C++引入的特性。 ### 指针作为函数形参 指针作为函数参数,用于保存函数调用期间传递的参数的地址,这也称为按引用调用。通过引用调用函数时,对引用变量所做的任何更改都会影响原始变量。 #### 使用方法 以下是一个使用指针交换两个数字的示例代码: ```c #include <stdio.h> // 定义一个交换函数形参为两个整型指针 void swap(int *a, int *b); int main() { int m = 10, n = 20; printf("m = %d\n", m); printf("n = %d\n\n", n); // 传递m和n的地址给swap函数 swap(&m, &n); printf("After Swapping:\n\n"); printf("m = %d\n", m); printf("n = %d", n); return 0; } /* 指针 'a' 和 'b' 保存并指向 'm' 和 'n' 的地址 */ void swap(int *a, int *b) { int temp; // 交换指针所指向的值 temp = *a; *a = *b; *b = temp; } ``` 在这个示例中,`swap` 函数接受两个整型指针作为形参。在 `main` 函数中,通过 `&m` 和 `&n` 传递 `m` 和 `n` 的地址给 `swap` 函数。在 `swap` 函数内部,通过解引用操作 `*a` 和 `*b` 来访问和修改 `m` 和 `n` 的值。 #### 特点 - **按引用调用**:对指针所指向的变量进行修改会影响到原始变量,因为指针保存的是原始变量的地址。 - **可以修改实参的值**:如上述示例中,`swap` 函数成功交换了 `m` 和 `n` 的值。 - **传递效率高**:对于大型数据结构,传递指针比传递整个数据结构更高效,因为只需要传递地址,而不是复制整个数据。 ### void* 指针作为函数形参 `void*` 指针作为函数形参时,表示可以接受任意类型的参数,但是函数内在使用时要先强制转换,否则无法使用,不能对 `void*` 类型的指针进行解引用。 #### 使用方法 ```c #include <stdio.h> // 函数接受一个void*类型的指针 void print_int(void *ptr) { // 先将void*指针强制转换为int*指针 int *int_ptr = (int *)ptr; // 解引用int*指针并打印值 printf("The value is: %d\n", *int_ptr); } int main() { int num = 42; // 传递num的地址给print_int函数 print_int(&num); return 0; } ``` 在这个示例中,`print_int` 函数接受一个 `void*` 类型的指针作为形参。在函数内部,先将 `void*` 指针强制转换为 `int*` 指针,然后再进行解引用操作。 #### 特点 - **通用性强**:可以接受任意类型的指针,提高了函数的通用性。 - **使用时需要强制转换**:在函数内部使用 `void*` 指针时,需要将其强制转换为具体的指针类型,才能进行解引用等操作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值