二维数组和一维数组传参&&两个奇葩代码讲解
【摘要】 「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」 二维数组的深层次理解arr:二维数组数组名,首元素地址:第一行的地址,指向第一行arr+1:第2行的地址 ,指向第二行*(arr+1) : 得到第二行的数组名*(arr+1)+j : 得到第二行下标为j的元素的地址*(*(arr+1)+j):得到第二行下标为j的元素void Print(int(*p)[5],i...
「这是我参与2022首次更文挑战的第29天,活动详情查看:2022首次更文挑战」
二维数组的深层次理解
arr:二维数组数组名,首元素地址:第一行的地址,指向第一行
arr+1:第2行的地址 ,指向第二行
*(arr+1) : 得到第二行的数组名
*(arr+1)+j : 得到第二行下标为j的元素的地址
*(*(arr+1)+j):得到第二行下标为j的元素
void Print(int(*p)[5],int r,int c)
Print1(arr,3,5);
//把arr传给p ,p有能力接收arr,说明p == arr
// p[i][j] == arr[i][j]
6.解释代码含义
去掉数组名->就是数组的类型
去掉数组名+元素个数->就是数组中的元素类型
int arr[5]; //整形数组,元素类型为int,元素个数为5
int *parr1[10];//parr1先和[]结合,parr1是一个数组,parr1为数组名,去掉数组名和元素个数->元素类型为:int* ,所以数组中的元素类型为int*,所以parr1是一个存放整形指针的数组,元素个数为10个
int (*parr2[10])[5];//parr2先和*结合,是指针,指向的是数组。数组有10个元素,每个元素是int类型
int(*parr3[10])[5];//parr3先和[]结合,parr3是一个数组,数组有10个元素,去掉数组名和元素个数->元素类型为:int(*)[5],每个元素是一个数组指针,指向的数组有5个元素,每个元素是int类型
7.一维数组传参
//写法1:
void test(int arr[]);
//写法2
void test(int arr[10]);
//写法3
void test(int arr[100]);//虽然语法正确,但是不建议。
//一维数组名传参会降级为指针,所以括号内[]写不写元素个数都无所谓,且元素个数可以与实际元素个数不同
//写法4
void test(int* p);
int main()
{
int arr[10] = {0};
test(arr);
return 0;
}
//写法1
void test(int* arr[]);
//写法2
void test(int* arr[10]);
//写法3
void test(int* arr[100]);
//同上,括号内写的元素个数不影响
//写法4
void test(int** p);
int main()
{
int* arr[10] = {0};//数组元素类型为int*,所以arr是首元素地址,为int**类型
test(arr);
return 0;
}
8.二维数组传参
二维数组传参写成数组形式时,可以省略行,不可以省略列。
原因:对一个二维数组来说,可以不知道有多少行,但是必须知道一列有多少个元素
//写法1
void test(int arr[3][5]); //ok
//写法2
void test(int arr[][]); //err,不可以行和列同时省略
//写法3
void test(int arr[][5]);//ok,可以省略行,不可以省略列
//写法4
void test(int** p);//err
//写法5
void test(int(*p)[5]);//ok
//对于写法4和写法5:二维数组的数组名->首元素地址(第一行的地址),第一行是一个一维数组,相当于把一维数组的地址传过去,要使用数组指针接收
//所以参数写成int(*p)[5]-数组指针而不是int** p-二级指针
main()
{
int arr[3][5] = {0};
test(arr);
return 0;
}
二级指针和二维数组没有必然关系
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)