C/C++函数的参数传递
参数可分为函数的实参和函数的形参,
但是注意这是两个不同地址空间的参数变量。
如下函数
下面展示一些 内联代码片
。
// A code block
int value;
void func(int param);
在代码段
func(value);//调用func函数并传入实参value
1.编译器或cpu会生成一个新的变量 :int param,这个变量就是func函数的形参。
2.将value传递给函数func的过程在编译器眼里就是将value这个内存空间地址中的值传给func函数中对应的形参
3.param对应接收传进来的内存空间地址上对应的值 用代码理解就是param=value;
4.后续在func函数内部针对param变量的任何修改操作都不会影响value,因为他俩本就不是一个东东(不是一个地址空间的变量)
其实函数参数传递的过程就此一种,但是还有人说在C/C++的书上还介绍过指针传递和引用传递,有什么不同吗?其实没有不同只是在值传递的基础上多了一些“巧合”
// A code block
int* value = null;
int num = 35;
value = #
void func(int* param)
{
*param = 35;
}
说来话长,很多人对指针望而生畏,其实不用,指针就是一种变量,和基本数据类型:int char flota是一样的,只不过是它长的特殊 type* 而已。变量就是一个内存空间上地址的体现,定义了一个变量,这个变量就能存储这个变量类型大小的数据,编译器在后续针对该变量的处理也会遵照该变量定义的类型。指针同理也是一个存储数据的地址空间,所以value = # 它就和num = 35;是一样的都是存储了一个数据(只不过指针存的那个数据是一个地址),当给指针赋值后就产生了2个地址一个地址是指针变量本身的地址(任何变量都有的在内存空间上的地址)另一个地址就是指针变量存储的那个数据地址(被理解成地址的数据num变量所在内存空间的地址)
那么(终于说到正题)
func(value );
传递的是什么?传递的是value内存储的数据(数据地址)在上面代码中赋值为null了在此也就是传递了null;
func(&num);
传递的是num变量的地址
在func内部形参param = num的地址,所以操作*param 就相当于在num变量的地址上做操作一样。
怎样在函数内部,将地址传给指针参数。通过指针参数带回。
#include <stdio.h>
void get_addresses(char **str_address, int **int_address) {
char string[] = "Hello, World!";
int number = 123;
*str_address = string;
//为啥不是str_address=string;
//因为在参数传递的时候就是str_address = &str, 用str_address=string;就相当于为形参改了指向
*int_address = &number;
}
int main() {
char *str;
int *num;
get_addresses(&str, &num);
printf("String: %s\n", str);
printf("Number: %d\n", *num);
return 0;
}