C++调用涉及数组的函数需要传入数组长度的原因

在C++编写选择排序时,若调用排序函数不传入数组大小,程序结果不符预期。调试发现,在main函数里,可用sizeof(A)/sizeof(A[0])计算数组大小;而在函数体内,sizeof(A)是指针类型大小,无法用于计算数组大小。

在写一个简单的选择排序时,发现如果不在调用排序函数时传入数组大小,程序得不到预期结果,经过调试,发现原来在不同地方sizeof(A)的结果是不同的,具体如下

 #include<cstdio>
 #include<iostream>
 using namespace std;
 
void selectSort(int A[],int n){
	//int n = sizeof(A)/sizeof(A[0]);
	for(int i = 0; i< n; i++){
		int k = i;
		for(int j = i; j < n; j++){
			if(A[j]<A[k])
				k = j;
		 } 
		 int temp = A[k];
		 A[k] = A[i];
	 	 A[i] = temp;	 
	 }

} 	

int main(){
	int A[5] = {1,3,2,5,4};
	int n = sizeof(A)/sizeof(A[0]);
	cout<<sizeof(A)<<endl;
	//cout<<n<<endl;
	selectSort(A, n);
	for(int i = 0; i < 5; i++){
		cout<<A[i]<<endl;
	}
} 

在mian函数中,sizeof(A)是所有数组元素所占用的内存空间字节数,因此可以通过sizeof(A)/sizeof(A[0])计算数组大小,而在定义的函数体内,sizeof(A)是A这个指针类型的大小,不能计算数组大小。

### C++函数调用数组作为参数的方法 在 C++ 中,可以通过多种方法将数组作为参数递给函数。这些方法包括: #### 1. 数组(按值递) 当数组被当作参数递时,实际上递的是指向该数组第一个元素的指针。由于这种特性,在定义接收数组函数时,通常还需要提供一个表示数组长度的额外参数。 ```cpp void printArray(int arr[], int size) { for (int i = 0; i < size; ++i) { std::cout << arr[i] << " "; } std::cout << std::endl; } ``` 此代码展示了如何创建一个名为 `printArray` 的函数,它接受两个参数:一个是整型数组 `arr[]` 和另一个用于指示数组大小的整数 `size`[^1]。 #### 2. 使用固定大小的一维数组 如果已知数组的确切尺寸,则可以在声明形参时指定其大小。然而这种方法不够灵活,因为它限定了输入数组的具体规模。 ```cpp void processFixedSizedArray(int fixedArr[5]) { // 处理逻辑... } ``` 这种方式适用于特定场景下的编程需求,但在大多数情况下并不推荐使用,因为缺乏灵活性。 #### 3. 数组引用 为了更高效地处理大型数据集并避免不必要的复制开销,可以采用引用的方式递整个数组对象至目标函数。这不仅简化了语法结构而且提高了性能表现。 ```cpp template<typename T, size_t N> void modifyArray(T (&array)[N]) { // 修改或读取 array 数组中的元素 } ``` 上述模板化版本允许任何类型的同质序列成为合法实参与之匹配,并且能够自动推导出实际传入容器的实际容量[^4]。 #### 4. 指向数组的指针 除了直接利用数组名称外,还可以借助于指向一维或多维矩阵起始位置的指针完成相应操作。对于多维度情形而言,需注意正确设置各层嵌套关系以便准确定位所需访问的目标单元格。 ```cpp void operateOnMatrix(int (*matrixPtr)[cols], int rows) { // 对 matrixPtr 所指向二维表执行某些动作 } ``` 这里展示了一个例子,其中 `operateOnMatrix` 接收一个指向具有固定列数 (`cols`) 表格行首部地址以及总行计数值(`rows`) 的双重间接寻址变量。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值