在C语言中,函数的参数不仅可以是整数、小数、字符等具体的数据,还可以是指向它们的指针。用指针变量作函数参数可以将函数外部的地址传递到函数内部,使得在函数内部可以操作函数外部的数据,并且这些数据不会随着函数的结束而被销毁。
是一系列数据的集合,如数组、字符串、动态分配的内存等,不能用一个参数全部传递到函数内部。 只能传递这些指针,并在函数内部通过指针影响它们的数据集合。
在某些情况下,还必须使用指针来处理基本类型的数据,如整数、小数和字符。 一个典型的例子是交换两个变量的值。 有兴趣想学习的同学加入c语言c交流壹496926338组内有很多项目开发和初学者教育视频等着千人参加。
一些初学者用以下方法交换两个变量值:
执行结果:
a=66,b=99
从结果可以看出,a、b的值没有变化,更换失败。 这是因为swap ) )函数内部的a、b和main ) )函数内部的a、b是不同的变量,消耗了不同的内存。 这些不仅名字相同,也没有其他关系。 swap ) ) )交换其内部的a、b的值,不影响其外部(main ) )内部的a、b的值。
使用指针变量作为参数可以很容易地解决上述问题。
执行结果:
a=99,b=66
交换) )函数时,将变量a、b的地址分别赋予p1、p2。 这样,*p1、*p2表示变量a、b本身,交换*p1、*p2的值也就是说交换了a、b的值。 函数执行结束后,p1、p2将被废弃,但它对外部的a、b的影响将“永久化”,不会随着函数的结束而“复原”。
需要注意的是临时变量temp,*p1=*p2; 语句后面的a的值会复盖b的值,如果不先保存a的值,以后就找不到了。
将数组用作函数参数
数组是不能通过参数一次传递到函数内部的一组数据。 要在函数内部操作数组,必须传递数组指针。 下面的示例定义一个函数max ),该函数在数组中查找值最大的元素)。
执行结果:
12 55 30 8 93 27
最大值is 93!
参数intArr只是一个数组指针,函数内部无法通过该指针获得数组长度。 必须将数组长度作为函数参数传递到函数内部。 数组nums的每个元素都是整数,scanf ()在读取用户输入的整数时,必须提供存储整数的内存地址。 nums i是第I个数组元素的地址。
如果使用数组作为函数参数,则参数也可以是“真”数组。 例如,上面的max ) )函数的参数可以记述如下。
int intArr[6]似乎定义了一个包含六个元素的数组(max ) ),可以将数组的所有元素传递给“组合”。
读者也可以省略数组的长度,将形参缩短为以下形式。
实际上,这两种格式的数组定义都是幻想,无论是int intArr[6]还是int intArr[]都不会创建数组,编译器也不会为它们分配内存。 实际的数组不存在,最终转换为int *intArr之类的指针。 也就是说,无论哪种形式都不能用“一个大脑”传递数组的所有要素,必须好好使用数组指针。
int intArr[6]格式仅表示函数期望传递给用户的数组中有六个元素,而不意味着数组中只有六个元素。 实际传递的数组可以有6个以下的元素。
需要强调的是,无论用何种方法传递数组,都无法在函数内部求出数组长度。 因为intArr只是指针,不是真正的数组,所以需要添加参数来传递数组长度。
c语言为什么不允许直接传递数组的所有元素,而必须传递数组指针呢?
参数的传递本质上是代入的过程,代入就是复制存储器。 内存复制是指将一个内存中的数据复制到另一个内存中。 有兴趣想学习的同学加入c语言c交流壹496926338组内有很多项目开发和初学者教育视频等着千人参加。
对于基本类型的数据(如int、float和char ),内存通常只占用几个字节,而内存拷贝速度非常快。 另一方面,数组是一系列数据的集合,数据的数量没有限制,可以很少,也可以成千上万。 将它们复制到内存是一个漫长的过程,可能会显着降低程序的效率。 为了防止手艺不好的程序员编写低效的代码,c语言在语法上不支持数据集合的直接赋值。