对于数组作为函数形参的一些发现

本文通过一个C语言示例,深入探讨了数组作为函数参数时的行为特性,特别是数组退化为指针的现象,以及如何正确理解形参与实参的关系。实验结果显示,尽管在函数调用中数组名会退化为指针,但在函数内部,我们依然可以使用strlen()等函数来获取数组的长度。

对于数组作为函数形参的一些发现

#include<stdio.h>
int func(char ch[])//不需要定义第一维的大小
{
	int a = strlen(ch);
	
	printf("子函数里ch=%p &ch=%p\n", ch, &ch);
//将子函数里形参ch和&ch都输出
	return a;
}
int main()
{
	int a;
	char ch[]="abcdef";
	printf("主函数里ch=%p &ch=%p\n", ch, &ch);
//将主函数里实参ch和&ch都输出,与上面做对比
	if(a = func(ch));//在if语句和赋值语句中引用子函数,看子函数是仅仅返回值还是整个执行
	printf("字符串的长度为%d",a);
	return 0;
}

输出结果:
主函数里ch=012FFCD8 &ch=012FFCD8
//主函数里ch和&ch相等,表明这就是一个地址常量

子函数里ch=012FFCD8 &ch=012FFC00
//子函数里ch和&ch却不相等,说明它不是地址常量,它就是一个指针变量。
同时,这一语句的出现说明无论在哪引用子函数,子函数都是整个执行

字符串的长度为6
//虽然在子函数里ch不是地址常量,但用法没有什么大的区别,仍可以使用strlen()函数

### 将数组作为函数形参使用 当在 C++ 或者 C 语言中将数组作为函数参数传递时,实际上传递的是指向该数组第一个元素的指针[^1]。这意味着,在默认情况下,不会自动传递数组的实际尺寸信息到被调用的函数内。 为了安全有效地处理这种情况并预防可能发生的越界访问错误,开发者通常会采取额外措施来确保数据的安全性和准确性[^2]。以下是几种常见的法: #### 方法一:通过附加参数指定数组大小 最简单的方法之一是在定义函数原型时增加一个表示数组长度的新参数,并且每次调用此函数的时候都提供相应的值。 ```cpp void printArray(int arr[], int size) { for (int i = 0; i &lt; size; ++i) { std::cout &lt;&lt; arr[i] &lt;&lt; &#39; &#39;; } } ``` 这种方法适用于任何类型的固定大小的一维或多维数组[^4]。 #### 方法二:利用模板和引用传递 对于更复杂的场景,特别是当你想要严格控制输入数组的具体维度时,可以采用模板配合引用的方式来进行操作。这种方式能够强制编译器检查实际传入的数据结构是否匹配预期的要求。 ```cpp template&lt;size_t N&gt; void processFixedSizedArray(int (&amp;arr)[N]) { // 这里可以直接使用N代表数组的确切长度 for(size_t i=0;i&lt;N;++i){ std::cout&lt;&lt;arr[i]&lt;&lt;&#39; &#39;; } } ``` 上述例子展示了如何创建仅接收特定大小(本例中为 `N`)整数数组的过程[^5]。 #### 方法三:借助 STL 容器类库 现代 C++ 编程实践中推荐尽可能多地依赖标准模板库(STL),比如 vector, array 等容器类型代替原始数组。这些高级别的抽象不仅提供了更好的安全性保障,还简化了许多常见任务的操作流程。 ```cpp #include&lt;vector&gt; void operateOnVector(const std::vector&lt;int&gt;&amp; vec) { for(auto&amp; elem : vec){ std::cout&lt;&lt;elem&lt;&lt;&#39; &#39;; } } ``` 以上三种方式都可以有效解决直接使用传统C风格数组所带来的局限性问题,同时也提高了程序的整体健壮性和可维护性。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值