建设银行贵阳市网站电话,网站推广软文选择天天软文,建设银行网站修改密码,seo人员的相关薪资1、一维数组传参的本质
数组传参是指在函数调用时将数组作为参数传递给函数。
int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };test(arr);return 0;}数组传参只需要写数组名就可以了。注意#xff1a;数组名是arr#xff0c;而不是arr[10]
数组传参形参该怎么写呢 { 1,2,3,4,5,6,7,8,9,10 };test(arr);return 0;}数组传参只需要写数组名就可以了。注意数组名是arr而不是arr[10]
数组传参形参该怎么写呢
void test(int arr[])//元素个数写不写无所谓等下会说为什么写不写都不影响
现在我们来分别在(test)函数外部与函数内部计算数组元素的个数、
来展示 可以看到在函数内部sz2结果为1而函数外部sz1结果为10这是为什么呢
关于sz1 10的结果我们都清楚sizeof(arr)求得数组的总大小sizeof(arr[0])求得数组首元素的大小然后得出元素个数但是为什么在test函数内部求得的元素个数结果变为1了呢
我们来逆推一下首先sizeof(arr[0])表示的是数组首元素的大小是不变的因此sizeof(arr[0])等于4
sz2 sizeof(arr) / 4 1因此sizeof(arr)也等于4那么在什么情况下能得到aizeof(arr) 4 呢
在数组传参的时候 test(arr)我们传递的是整个数组吗还记得前面关于数组名的理解吗这里arr既不是在sizeof中前面也没有符号所以test(arr)中的arr指的就是数组首元素的大小因此我们传参过去的是首元素的地址这便是一维数组传参的本质既如此我们便可以明白aizeof(arr) 4是怎么得到的了地址在32位机器上占4个字节在64位机器上占8个字节 小编是在32位上操作的所以最终得到izeof(arr) 4 的结果。
void test(int arr[])//元素个数写不写无所谓
{int sz2 sizeof(arr) / sizeof(arr[0]);printf(sz2 %d\n, sz2);
}
#include stdio.h
int main() {int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int sz1 sizeof(arr) / sizeof(arr[0]);printf(sz1 %d\n, sz1);test(arr);return 0;} 综上数组传参传递的就是首元素地址
1.我们传递的不是整个数组函数形参的部分是不会真实创建数组的所以就不需要数组大小也就是形参部分元素大小写不写都无所谓没有什么影响
2.数组传过去的是数组首元素地址地址应该拿指针来接收所以函数形参部分应该使用指针变量来接收而我们写成int arr[])是为了更加方便我们的理解。 void test(int arr[])可以写为void test(int* arr) 注意
一维数组传参的时候形参可以写成数组的方式主要是为了方便理解形参也可以写成指针变量的方式
如果我们想要在函数内部获取数组元素的个数该怎么写呢
void test(int arr[10],int sz)
{//遍历数组int i 0;for (i 0; i sz; i){printf( %d , arr[i]);}
}
#include stdio.h
int main()
{int arr[10] { 1,2,3,4,5,6,7,8,9,10 };int sz sizeof(arr) / sizeof(arr[0]);test(arr,sz);return 0;
}2、二维数组传参的本质
理解二维数组传参的本质
二维数组传参本质上也是传递了地址传递的是第一行这个一维数组的地址。
我们先来看一个二维数组传参的代码
#include stdio.h
#include string.h
void print(int arr[3][5],int a,int b)
{for (int i 0; i a; i) //遍历行数{for (int j 0; j b; j)//遍历列数{printf(%d , arr[i][j]);}printf(\n);//换行}
}
int main()
{int arr[3][5] { 1,2,3,4,5, 2,3,4,5,6, 3,4,5,6,7, };print(arr, 3, 5);return 0;
} 上列代码中实参是⼆维数组形参也写成⼆维数组的形式那我们该怎么理解二维数组传参的操作呢 从上图中我们可以看到二维数组传参传递的也是数组名数组名是什么呢
数组名是数组首元素的地址所以二维数组实参传递的是地址既然传递的是地址那么形参也就可以使用指针来接收。
这里你可能又会有一个疑问二维数组的数组名到底是表示谁的地址也就是二维数组的首元素是什么
这里我们就需要对二维数组做一些更深入的理解了前面关于数组的介绍篇章也说过
关于二维数组我们可以把一维数组当作是数组的元素那么这时候的数组就是二维数组 1 12345 12345 int intintintintint 23456 34567数组元素一维数组 intintintintint 二维数组 所以我们可以这么理解
二维数组其实是一维数组的数组二维数组的每一个元素都是一维数组
这样我们就可以把二维数组的每一行看作是一个元素所以二维数组的首元素就是它的第一行
二维数组的数组名表示的就是第一行的一维数组的地址。 也就是说我们二维数组实参传过去的就是一维数组的地址
形参部分如果想要写成指针的方式该怎么写呢
由于实参传递的是数组的地址所以形参应该使用数组指针来接收
表达形式int (*arr)[5]还记得为什么这么写吗
arr与*结合说明arr是指针指针指向的是数组 [5]说明数组有5个元素每个元素类型是int
(*arr)是因为需要arr先于*结合。如果不使用圆括号arr就不再是指针变量而是会与[5]结合变为数组名。
C:指针学习-指针变量—学习笔记-CSDN博客
如果对于数组指针有一些不明白的地方可以看一看这篇文章哟
参部分用指针改写后void print ( int(*arr)[5] , int a, int b) 二维数组在内存中是连续存放的所以 1 2 3 4 5 2 3 4 5 6 可以理解为 1 2 3 4 5 2 3 4 5 6 3 4 5 6 7 3 4 5 6 7 到这里是否能够理解二维数组传参的本质了吗
二维数组传参传递的不是二维数组而是二维数组首元素的地址也就是第一行的地址所以形参的部分要拿数组指针来接收。 使用指针访问到二维数组的全部元素
图片文字较小还请见谅当时画完后没注意到抱歉抱歉可以放大观看如有不理解的地方也可以私我我们一起探讨 代码就可以改写成这样
void print(int(*arr)[5], int a, int b)
{for (int i 0; i a; i){for (int j 0; j b; j){printf(%d , *(*(arr i)j));}printf(\n);}
}
是不是感觉这样写不是很好理解还可以换一种方式写*(*(arr i)j)
*(*(arr i)j)也可以写成arr[i][j]
这两种一种是指针的方式一种使用数组下标的方式。
3、总结
数组传参传递的都是地址所以形参都可以使用指针来接收
一位数组传参传递的是首元素地址使用类型指针来接收
二维数组传参传递的是一维数组的地址使用数组指针来接收。 本篇文章到这里就结束了希望能够对大家理解数组传参有所帮助