C语言学习第25篇---数组参数和指针参数剖析

举报
CodeAllen 发表于 2021/10/29 22:51:45 2021/10/29
【摘要】 知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取   之前结论:数组作为参数时会退化为一个指针   但是为什么呢? 1.C语言发明之初是为了编写操作系统,是以值拷贝的方式传递参数 2.当向函数传递数组时...

知识来源主要是陈正冲老师的《C语言深度解剖》及Delphi Tang老师的《C语言剖析》和《征服C指针》,《C和指针》,有兴趣的朋友可以看我置顶文章获取

 

之前结论:数组作为参数时会退化为一个指针

 

但是为什么呢?

1.C语言发明之初是为了编写操作系统,是以值拷贝的方式传递参数

2.当向函数传递数组时:

    -将整个数组拷贝一份传入参数 ,不可取

    -将数组名视为常量指针传递数组首元素的地址

 

C语言最初目的

1.整体拷贝效率太低

2.参数位于栈上,太大的拷贝会导致栈溢出

 

 

二维数组参数:

  • 二维数组参数同样存在退化的问题
  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语言无法向一个函数传递任意的多维数组
  • 必须提供除第一维外的所有维长度
  1. 第一维之外的维度信息用于完成指针运算
  2. N为数组的本质是一维数组,元素是N-1维的数组
  3. 对于多维数组的函数参数只有第一维是可变的

 

实例1:传递与访问二维数组


  
  1. #include <stdio.h>
  2. void access(int a[][3], int row) //只有第一维可以省略,后边的是用来完成指针运算的
  3. {
  4. int col = sizeof(*a) / sizeof(int); //3,计算数组长度
  5. int i = 0;
  6. int j = 0;
  7. printf("sizeof(a) = %d\n", sizeof(a)); //a的内存空间
  8. printf("sizeof(*a) = %d\n", sizeof(*a)); //打印数组大小
  9. for(i=0; i<row; i++)
  10. {
  11. for(j=0; j<col; j++)
  12. {
  13. printf("%d\n", a[i][j]); //遍历数组
  14. }
  15. }
  16. printf("\n");
  17. }
  18. void access_ex(int b[][2][3], int n)
  19. {
  20. int i = 0;
  21. int j = 0;
  22. int k = 0;
  23. printf("sizeof(b) = %d\n", sizeof(b));
  24. printf("sizeof(*b) = %d\n", sizeof(*b));
  25. for(i=0; i<n; i++)
  26. {
  27. for(j=0; j<2; j++)
  28. {
  29. for(k=0; k<3; k++)
  30. {
  31. printf("%d\n", b[i][j][k]);
  32. }
  33. }
  34. }
  35. printf("\n");
  36. }
  37. int main()
  38. {
  39. int a[3][3] = {{0, 1, 2}, {3, 4, 5}, {6, 7, 8}};
  40. int aa[2][2] = {0};
  41. int b[1][2][3] = {0};
  42. access(a, 3); //8
  43. access(aa, 2); //warnning ,数组元素类型是不匹配的
  44. access_ex(b, 1); //就是三维数组,三重循环打印
  45. access_ex(aa, 2);
  46. return 0;
  47. }

 

小结:

  • 1.C语言只会值拷贝的方式传递参数
  • 2.C语言中的数组参数必然退化为指针
  • 3.多维数组参数必须提供除第一维之外的所有维长度
  • 4.对于多维数组的函数参数只有第一维是可变的

文章来源: allen5g.blog.csdn.net,作者:CodeAllen的博客,版权归原作者所有,如需转载,请联系作者。

原文链接:allen5g.blog.csdn.net/article/details/89111667

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

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

全部回复

上滑加载中

设置昵称

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

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

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