服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - C/C++ - C语言 详细讲解数组参数与指针参数

C语言 详细讲解数组参数与指针参数

2022-11-10 15:06清风自在 流水潺潺 C/C++

这篇文章主要介绍了C语言中数组参数与指针参数的分析,本文通过示例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下

一、C语言中的数组参数退化为指针的意义

C 语言中只会以值拷贝的方式传递参数

当向函数传递数组时:

  • 将整个数组拷贝一份传入函数
  • 将数组名看做常量指针传数组首元素地址 √

C 语言以高效作为最初设计目标:

  • a) 参数传递的时候如果拷贝整个数组执行效率将大大下降。
  • b) 参数位于栈上,太大的数组拷贝将导致栈溢出。

二、二维数组参数

二维数组参数同样存在退化的问题

  • 二维数组可以看做是一维数组
  • 二维数组中的每个元素是一维数组

二维数组参数中第一维的参数可以省略

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 维的数组
  • 对于多维数组的函数参数只有第一维是可变的

下面看一个传递与访问二维数组与三维数组的示例:

#include <stdio.h>

void access(int a[][3], int row)
{
  int col = sizeof(*a) / sizeof(int);
  int i = 0;
  int j = 0;
  
  printf("sizeof(a) = %d\n", sizeof(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);
  //access(aa, 2);
  access_ex(b, 1);
  //access_ex(aa, 2);
  
  return 0;
}

输出结果如下:

C语言 详细讲解数组参数与指针参数

五、小结

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

到此这篇关于C语言 详细讲解数组参数与指针参数的文章就介绍到这了,更多相关C语言 数组参数内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/weixin_43129713/article/details/123918829

延伸 · 阅读

精彩推荐
  • C/C++C语言详细分析常见字符串函数与模拟实现

    C语言详细分析常见字符串函数与模拟实现

    字符串函数(String processing function)也叫字符串处理函数,指的是编程语言中用来进行字符串处理的函数,如C,pascal,Visual以及LotusScript中进行字符串拷贝...

    二球悬铃木丶4092022-11-01
  • C/C++C++中事件机制的简洁实现及需要放弃的特性

    C++中事件机制的简洁实现及需要放弃的特性

    事件模型是被广泛使用的好东西,但是C++标准库里没有现成的,现在VC11可以用在XP下了,那么就痛快的拿起C++11提供的先进设施组合出一个轻便的实现吧感兴...

    C++教程网1832020-11-17
  • C/C++C语言中变量与其内存地址对应的入门知识简单讲解

    C语言中变量与其内存地址对应的入门知识简单讲解

    这篇文章主要介绍了C语言中变量与其内存地址对应的入门知识简单讲解,同时这也是掌握指针部分知识的基础,需要的朋友可以参考下...

    C语言教程网10702021-03-17
  • C/C++详解C语言中free()函数与getpagesize()函数的使用

    详解C语言中free()函数与getpagesize()函数的使用

    这篇文章主要介绍了详解C语言中free()函数与getpagesize()函数的使用,是C语言入门学习中的基础知识,需要的朋友可以参考下...

    C语言教程网6622021-03-08
  • C/C++C++ 实现LRU 与 LFU 的缓存算法

    C++ 实现LRU 与 LFU 的缓存算法

    设计和实现一个LRU 缓存机制。其支持获取数据 get 和 写入数据 put,设计并实现最少访问频率(LFU)缓存的数据结构。LFU的每个数据块都有一个引用计数,...

    Ito Schum3982022-01-05
  • C/C++C++用easyx图形库实现障碍跑酷小游戏

    C++用easyx图形库实现障碍跑酷小游戏

    这篇文章主要为大家详细介绍了C++用easyx图形库实现障碍跑酷小游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一...

    小小城序员11122021-10-15
  • C/C++基于Opencv实现双目摄像头拍照程序

    基于Opencv实现双目摄像头拍照程序

    这篇文章主要为大家详细介绍了基于Opencv实现双目摄像头拍照程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...

    sk_sk11592021-07-28
  • C/C++关于C语言除0引发的思考

    关于C语言除0引发的思考

    很多 C 库都提供了一组函数用来判断一个浮点数是否是无穷大或 NaN。int _isnan(double x) 函数用来判断一个浮点数是否是 NaN,而 int _finite(double x) 用以判断一个...

    C语言教程网2062020-12-22