C指针之输入型参数与输出型参数

输入型参数与输出型参数

函数为什么需要形参与返回值

  • 函数名是一个符号,表示整个函数代码段的首地址,实质是一个指针常量,所以在程序中使用到函数名时都是当地址用的,用来调用这个函数的。
  • 函数体是函数的关键,由一对{}括起来,包含很多句代码函数体就是函数实际做的工作
  • 形参列表和返回值。
    • 形参是函数的输入部分,返回值是函数的输出部分。
    • 对函数最好的理解就是把函数看成是一个加工机器(程序其实就是数据加工器),形参列表就是这个机器的原材料输入端;而返回值就是机器的成品输出端。
  • 其实如果没有形参列表和返回值,函数也能对数据进行加工,用全局变量即可。
    • 用全局变量来传参和用函数参数列表返回值来传参各有特点,在实践中都有使用。
    • 总的来说,函数参数传参用的比较多,因为这样可以实现模块化编程,而C语言中也是尽量减少使用全局变量。
  • 全局变量传参最大的好处就是省略了函数传参的开销,所以效率要高一些;
    • 但是实战中用的最多的还是传参,如果参数很多传参开销非常大,通常的做法是把很多参数打包成一个结构体,然后传结构体变量指针进去。
int multip5(int a);
void multip5_2(void);

int x;		// 被乘5的变量,也就是输入函数的变量
int y;		// 输出结果的变量

int main(void)
{
// 程序要完成功能是:对一个数乘以5
	// 第一种方法:函数传参
	int a = 3;
	int b;
	b = multip5(a);
	printf("result = %d.\n", b);
	
	// 第二种方法:用全局变量来传参
	x = 2;
	multip5_2();
	printf("y = %d.\n", y);
    return 0;
}
  
void multip5_2(void)
{
	y = 5 * x;
}


int multip5(int a)
{
	return a*5;
}

函数传参中使用const指针

  • const一般用在函数参数列表中,用法是const int *p;
    • 意义是指针变量p本身可变的,而p所指向的变量是不可变的。
  • const用来修饰指针做函数传参,作用就在于声明在函数内部不会改变这个指针所指向的内容,所以给该函数传一个不可改变的指针(char *p = "linux";这种)不会触发错误
    • 一个未声明为const的指针的函数,你给他传一个不可更改的指针的时候就要小心了
void func2(const int *p)
{
	*p = 5;
}

void func3(char *p)
{
	*p = 'a';
}

void func4(const char *p)
{
	*p = 'a';
}
        char *pStr = "linux";				// 
	//char pStr[] = "linux";			// ok的
	func3(pStr);
	printf("%s.\n", pStr);

函数需要向外部返回多个值时怎么办?

  • 一般来说,函数的收入部分就是函数参数,输出部分就是返回值。问题是函数的参数可以有很多个,而返回值只能有1个。这就造成我们无法让一个函数返回多个值。
  • 现实编程中,一个函数需要返回多个值是非常普遍的,因此完全依赖于返回值是不靠谱的
    • 通常的做法是用参数来做返回
    • 在典型的linux风格函数中,返回值是不用来返回结果的,而是用来返回0或者负数用来表示程序执行结果是对还是错,是成功还是失
  • 普遍做法,编程中函数的输入和输出都是靠函数参数的
    • 返回值只是用来表示函数执行的结果是对(成功)还是错(失败)
    • 如果这个参数是用来做输入的,就叫输入型参数;如果这个参数的目的是用来做输出的,就叫输出型参数。
  • 输出型参数就是用来让函数内部把数据输出到函数外部的。
int multip5_3(int a, int *p)
{
	int tmp;

	tmp = 5 * a;
	if (tmp > 100)
	{
		return -1;
	}
	else
	{
		*p = tmp;
		return 0;
	}
}
int main(void)
{
	int a, b = 0, ret = -1;
	
	a = 30;
	ret = multip5_3(a, &b);
	if (ret == -1)
	{
		printf("出错了\n");
	}
	else
	{
		printf("result = %d.\n", b);
	}
        return 0;
}
  • 总结
    • 看到一个函数的原型后,怎么样一眼看出来哪个参数做输入哪个做输出?
      • 函数传参如果传的是普通变量(不是指针)那肯定是输入型参数;
      • 如果传指针就有2种可能性了,为了区别:
        • 如果这个参数是做输入的(通常做输入的在函数内部只需要读取这个参数而不会需要更改它)就在指针前面加const来修饰;
        • 如果函数形参是指针变量并且还没加const,那么就表示这个参数是用来做输出型参数的。
    • 譬如C库函数中strcpy函数
      • char *strcpy(char* dest, const char *src);

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值