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

举报
CodeAllen 发表于 2021/10/29 22:51:45 2021/10/29
1.8k+ 0 0
【摘要】 知识来源主要是陈正冲老师的《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:传递与访问二维数组


      #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

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

作者其他文章

评论(0

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

    全部回复

    上滑加载中

    设置昵称

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

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

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