指针与函数传参
普通变量作为函数形参
1、函数传参时,普通变量作为参数时,形参和实参名字可以相同也可以不同,实际上就是实参来替代对应的形参的。
2、在子函数内部,形参的值等于实参。原因是函数调用时实参的值赋值给形参 —— 传值调用
数组作为函数形参
1、数组名作为形参传参时,实际传递的不是整个数组,而是数组的首元素的首地址。(也就是整个数组的首地址)所以在子函数内部,传进来的数组名等于是一个指向数组首地址的指针
2、在子函数内传参得到的数组首元素首地址,和外面得到的数组首元素首地址的值是相同的。
指针作为函数形参
和数组作为函数参数是一样的
结构体变量作为函数形参
1、和普通变量是一样的。
2、因为结构体一般都是很大,所以如果直接用结构体变量进行传参,那么函数调用效率就会很低。解决方案:不要传变量,传变量的指针地址进去。
传值和传址调用(经典例子swap函数)
在C语言中没有传值和传址两种方式,C语言本身函数调用时一直都是传值的,只不过传的值可以是变量名,也可以是变量的指针。
输入型参数与输出型参数
1、函数名是一个符号,表示整个函数代码段的首地址,实质是一个指针常量,所以在程序中使用到函数名都是当地址用的,用来调用函数的。
2、函数体是函数的关键,由一对{ }括起来,包括很多句代码,函数体就是函数实际做的工作。
3、形参列表和返回值。形参是函数的输入部分,返回值是函数的输出部分。
4、没有参数列表和返回值,函数也能用。参数可以用全局变量。
函数传参中使用const指针
const一般用在函数中,用法是const int *p;
const用来修饰指针做函数传参,作用就在于声明在函数内部不会改变这个指针所指向的内容,所以给该函数传一个不可改变的指针(char *p = “linux”)不会触发错误,而一个未声明为const的指针的函数,你给他传一个不可更改指针的时候就要小心出现错误
void func_1(char *p)
{
*p = 'a';
}
void main(void)
{
char *a = "linux"; // 出现段错误,原因是:这个字符串存在于代码段不能改变的
char a[] = "linux"; // 可以运行,结果为“aiunx”
func_1(a);
return 0;
}
一般来说输入的参数为输入参数,输出的参数为输出参数。函数的参数可以有很多个,而返回值只有一个。如果函数要返回很多值要怎么办呢?
编程中函数的输入和输出都是靠函数参数,返回值只是用来表示函数执行的结果是成功还是失败
如果这个参数是用来做输入的,就叫输入参数;如果这个参数的目的是输出的,就叫输出参数。
输出参数就是用来让函数内部把数据输出到函数外部的
看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出?
函数传参如果的是普通变量那肯定是输入型参数;
如果传指针就有两种可能:
如果这个参数是做输入的(通常做输入的在函数内部只需要读取这个参数而不会需要更改它)就在指针前面加上const来修饰
如果函数形参是指针变量并且还没加const,那么表示这个参数是用来做输出型参数的。