【C语言】使用指针传参(一维数组以及二维数组)

文章详细介绍了C++中一维数组和二维数组在函数参数传递中的常见方法,包括使用指针、二级指针和指针数组。通过示例代码解释了如何通过数组名、指针和二级指针来传递和操作数组内容。

一、一维数组传参(指针)

        main函数中传参都是数组名arr——首地址元素

如下图所示:

int main(void){
int arr[10]={0};
test(arr);//只需要数组名arr
}

 接收 test() 方法一

void test(int *arr){
    cout<<*(arr+2);//表示输出数组第三个元素
}

arr表示数组的首地址相加1表示下一个元素

#include<bits/stdc++.h>
using namespace std;
void test(int *arr){
	for(int i=0;i<5;i++){
		cout<<*(arr+i);
	}
}
int main(void){
	int arr[5]={1,2,3,4,5};
	test(arr);
	return 0;
}

其他方法(对于初学者来说先掌握方法一在在掌握以下几种方法)

方法二:使用二级指针类型

void test(int* *arr){
    //这里是传入一个int* 的*arr指针
}

使用指针变量存取指针

#include<bits/stdc++.h>
using namespace std;
void test(int* *arr){
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cout<<*(*(arr+i)+j);
		}
		cout<<'\n';
	}
}
int main(void){
	int *arr[3]={0};
	int a[3][3]={{1,2,3},{1,2,3},{1,2,3}};
	for(int i=0;i<3;i++){
		arr[i]=a[i];
	}
	test(arr);
	return 0;
}

对于更加详细介绍可以看下该代码,(43条消息) 二级指针传参(函数形参是二级指针)_芯辰大海的博客-优快云博客

#include<iostream>
using namespace std;
void test1(int **ptr) {
	cout << **ptr << endl;
}
void test2(char **p) {
 
}
int main() {
	int n = 10;
	int *p = &n;
	int **pp = &p;  //二级指针
	int* arr[10];  //指针数组,数组元素是指针
	test1(pp);  //正确
	test1(&p);  //正确
	test1(arr);  //正确 因为数组名是首元素地址,那也就是指针地址,
	//——————————————————————————————————————————————————————————————————————//
	char c = 'w';
	char* pc = &c;
	char** ppc = &pc;
	char* arr1[10];
	test2(ppc);  //正确
	test2(&pc);  //正确
	test2(arr1);  //正确
	system("pause");
	return 0;
}

方法三:使用指针数组(难点)

先看懂这条语句(目的,对数组指针有一个大概的了解)

int *p[3];     //定义指针数组
int a[3][4];
for(i=0;i<3;i++)
p[i]=a[i];     //通过循环将a数组每行的首地址分别赋值给p里的元素 

对于指针数组详细介绍访问如下链接,(43条消息) 指针数组和数组指针(非常易懂)_蔡泽基✔℡的博客-优快云博客

了解后,使用test()接收

void test(int *arr[]){

}
#include<bits/stdc++.h>
using namespace std;
	void test(int *arr[]){
		for(int i=0;i<3;i++){
			for(int j=0;j<3;j++){
				cout<<*(arr[i]+j);
			}
			cout<<'\n';
		}
	}
int main(void){
	int *arr[3]={0};//指针变量的初始化;
//不可以使用 int *arr[5]={1,2,3,4,5};进行初始化
//原因,指针的初始化或赋值可以使用0值、常量表达式、和类型匹配对象; 
	int a[3][3]={{1,2,3},{1,2,3},{1,2,3}};
	for(int i=0;i<3;i++){
		arr[i]=a[i];
	}
	test(arr);
	return 0;
}

二、二维数组传参

        在主函数中

int main(void){
    int arr[10][10]={0,0};
    test(arr);
}

在二维数组中*arr表示的是二维数组的首行地址

接受test()方法一

void test(int (*p)[10]){
    //注意,正常情况下都需要标明二维数组的列数量。
}
#include<bits/stdc++.h>
using namespace std;
void test(int (*p)[3]){//当然*p可以换成*arr
	for(int i=0;i<3;i++){
		for(int j=0;j<3;j++){
			cout<<(*(p+i))[j];
//*(p+i)表示第几行[j]表示第几列;
		}
		cout<<'\n';
	}
}
int main(void){
	int a[3][3]={{1,2,3},{1,2,3},{1,2,3}};
	test(a);
	return 0;
}

### C语言中传递二维数组作为函数参数的方法 在C语言中,可以通过多种方式二维数组作为参数传递给函数。以下是几种常见的方式: #### 方法一:直接传递二维数组 当直接传递二维数组时,可以省略第二维的大小,因为编译器会根据提供的数组自动确定这一维度的大小。不过,必须明确指定第一维的大小(除非使用变长数组指针指针)。需要注意的是,在函数参数列表中声明的第一维大小实际上并不会被检查,因此可以在函数内处理不同尺寸的数组[^2]。 ```c #include <stdio.h> void printArray(int arr[][3], int rows) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int myArray[2][3] = {{1, 2, 3}, {4, 5, 6}}; printArray(myArray, 2); return 0; } ``` 这段代码展示了如何定义并调用接受固定列数的二维数组作为参数的`printArray()`函数。 #### 方法二:使用指向数组指针 另一种方法是利用指向特定长度的一维数组指针来表示二维数组。这种方式更加灵活,并允许动态调整每行的数据量。为了实现这一点,需要先计算出每一行所占的空间大小,再创建相应的指针变量[^5]。 ```c #define ROWS 2 #define COLS 3 typedef int row_t[COLS]; // 定义一个新类型row_t代表一行整型数据 // 声明接收指向row_t类型的指针作为输入参数的函数 void processRows(row_t* matrix, size_t n_rows); int main(void){ static const row_t data[]={ {1, 2, 3}, {4, 5, 6} }; processRows(data, ROWS); return 0; } ``` 此示例说明了通过自定义类型简化语法以及提高可读性的技巧。 #### 方法三:采用双重指针 对于更复杂的情况,还可以考虑运用双重指针(`int **`)的形式来进行操作。这涉及到手动分配内存空间用于存储各行地址,并初始化这些位置指向各自的实际数据区域[^3]。 ```c #include <stdlib.h> #include <string.h> double** createMatrix(size_t m, size_t n){ double *data = malloc(m*n*sizeof(double)); double **matrix = malloc(m*sizeof(*matrix)); if (!data || !matrix){ free(data); free(matrix); exit(-1);} memset(data, '\0', m*n*sizeof(double)); for (size_t r=0;r<m;++r) *(matrix+r)=&(data[r*n]); return matrix; } void destroyMatrix(double** mat,size_t m){ free(mat[0]);free(mat); } ``` 上述例子给出了创建和销毁基于双层间接寻址机制建立起来的大规模矩阵结构的过程。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值