C语言学习第25篇---数组参数和指针参数剖析
知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取
之前结论:数组作为参数时会退化为一个指针
但是为什么呢?
1.C语言发明之初是为了编写操作系统,是以值拷贝的方式传递参数
2.当向函数传递数组时:
-将整个数组拷贝一份传入参数 ,不可取
-将数组名视为常量指针传递数组首元素的地址
C语言最初目的
1.整体拷贝效率太低
2.参数位于栈上,太大的拷贝会导致栈溢出
二维数组参数:
- 二维数组参数同样存在退化的问题
- 二维数组可以看做一维数组
- 二维数组中的每一个元素是一维数组
- 二维数组参数中的第一维的参数可以省略
void f(int a[5]) <===> void f(int a[]) <===> void f(int* a)
void g(int a[3][3]) <===> void g(int a[][3]) <===> void g(int (*a)[3])
总结了一个等价关系(牢牢记住,工程中经常使用)
从图中可以看出,并不是二维数组退化为指针的指针
数组参数 |
等效的指针参数 |
一维数组 : float a[5] |
指针 : float *a |
指针数组 int* a[5] |
指针的指针 int **a |
二维数组 char a[3][4] |
数组的指针 char (*a)[4] |
几个注意:
- C语言无法向一个函数传递任意的多维数组
- 必须提供除第一维外的所有维长度
- 第一维之外的维度信息用于完成指针运算
- N为数组的本质是一维数组,元素是N-1维的数组
- 对于多维数组的函数参数只有第一维是可变的
实例1:传递与访问二维数组
-
#include <stdio.h>
-
void access(int a[][3], int row) //只有第一维可以省略,后边的是用来完成指针运算的
-
{
-
int col = sizeof(*a) / sizeof(int); //3,计算数组长度
-
int i = 0;
-
int j = 0;
-
-
printf("sizeof(a) = %d\n", sizeof(a)); //a的内存空间
-
printf("sizeof(*a) = %d\n", sizeof(*a)); //打印数组大小
-
-
for(i=0; i<row; i++)
-
{
-
for(j=0; j<col; j++)
-
{
-
printf("%d\n", a[i][j]); //遍历数组
-
}
-
}
-
-
printf("\n");
-
}
-
void access_ex(int b[][2][3], int n)
-
{
-
int i = 0;
-
int j = 0;
-
int k = 0;
-
-
printf("sizeof(b) = %d\n", sizeof(b));
-
printf("sizeof(*b) = %d\n", sizeof(*b));
-
-
for(i=0; i<n; i++)
-
{
-
for(j=0; j<2; j++)
-
{
-
for(k=0; k<3; k++)
-
{
-
printf("%d\n", b[i][j][k]);
-
}
-
}
-
}
-
-
printf("\n");
-
}
-
int main()
-
{
-
int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
-
int aa[2][2] = {0};
-
int b[1][2][3] = {0};
-
-
access(a, 3); //8
-
access(aa, 2); //warnning ,数组元素类型是不匹配的
-
access_ex(b, 1); //就是三维数组,三重循环打印
-
access_ex(aa, 2);
-
-
return 0;
-
}
小结:
- 1.C语言只会值拷贝的方式传递参数
- 2.C语言中的数组参数必然退化为指针
- 3.多维数组参数必须提供除第一维之外的所有维长度
- 4.对于多维数组的函数参数只有第一维是可变的
文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。
原文链接:allen5g.blog.csdn.net/article/details/89111667
- 点赞
- 收藏
- 关注作者
评论(0)