二维数组和一维数组传参&&两个奇葩代码讲解

举报
芒果_Mango 发表于 2022/02/26 21:46:08 2022/02/26
【摘要】 「这是我参与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首次更文挑战

二维数组的深层次理解

image-20220214210020314


image-20220214210033237

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类型

image-20220214210102737


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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。