1. 数组参数退化为指针的意义

(1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的。

(2)参数位于栈上,太大的数组拷贝将导致栈溢出。

(3)将数组名看做常量指针,传递的是数组的首元素地址,而不是整个数组。

2. 二维数组参数

(1)二维数组参数同样存在退化的问题:

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

(2)二维数维参数中第一维的参数可以省略

①void f(int a[5])←→void f(int a[])←→void f(int* a)

②void g(int a[5][3])←→void g(int a[][3])←→void g(int (*a)[3]);

(3)等价关系

数组参数

等效的指针参数

备注

一维数组:float a[5]

指针:float* a

相当于数组去掉第1维,然后把数组名前加上*。

指针数组:int* a[5]

指针的指针:int** a;

二维数组:char a[3][4]

数组的指针:char(*a)[4]

(4)被忽视的知识点

①C 语言中无法向一个传递任意多维数组。换一句话讲,形参 int a[][3]是合法的,但 inta[][]是非法的。

①因此,必须提供除第 1 维之外的所有其他维长度。第一维之外的维度信息用于完成指针运算。

传递与访问二维数组

#include <stdio.h>

void access(int a[][],int row) //a[][3],形参第2维的长度必须提供
{
int col = sizeof(*a)/sizeof(int); int i = ;
int j = ; printf("sizeof(a) = %d\n",sizeof(a)); //指针,4字节 //a为int (*a)[3]类型,即a指向一个有3个int型元素的数组
printf("sizeof(*a) = %d\n",sizeof(*a));//3*4 =12字节 for(i = ;i < row; i++)
for(j = ; j < col; j++)
{
printf("%d\n", a[i][j]);
} printf("\n");
} void access_ex(int b[][][],int n) //数组参数的第2、3维长度必须提供
{
int i = ;
int j = ;
int k = ; printf("sizeof(b) = %d\n",sizeof(b)); //指针,4字节 //b为int (*b)[2][3]类型,即b指向一个有2行3列int型元素的二维数组
printf("sizeof(*b) = %d\n",sizeof(*b));//2 * 3 * 4 = 24字节 for(i = ;i < n; i++)
for(j = ; j < ; j++)
for(k = ; k < ; k++)
{
printf("%d\n", b[i][j][k]);
} printf("\n");
} int main()
{
int a[][] = {{, , },{, , },{, , }};
int aa[][] = {};
int b[][][] = {}; access(a, );
//access(aa,2);//error,int(*)[2]与int (*)[3]类型不匹配 access_ex(b, );
//access_ex(aa,2);//int(*)[2]与int(*)[2][3]类型不匹配 return ;
}

参考资料:
www.dt4sw.com
http://www.cnblogs.com/5iedu/category/804081.html

C语言学习笔记--数组参数和指针参数的更多相关文章

  1. C语言学习笔记--数组指针和指针数组

    C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...

  2. c语言学习笔记(9)——指针

    指针是c语言的灵魂 ----------------------------------------------------------------------------- # include &l ...

  3. GO 语言学习笔记--数组切片篇

    1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...

  4. c语言学习笔记 —— 数组

    1. 数组的内存分配原理. 数组定义  int a[3] = {1,3,11}; 如下写法是错误的: int number; int a[number] = {1,7,9}; 原因是:没有定长的数组初 ...

  5. 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘

    #深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...

  6. 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?

    "指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...

  7. c语言学习笔记.数组.

    数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...

  8. 大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?

    静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放:静态内存是在栈中分配的: 动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误 ...

  9. Go语言学习笔记九: 指针

    Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...

随机推荐

  1. External (and Live) snapshots with libvirt

    list all the block devices associated with the guest $ virsh domblklist testvm --details Type Device ...

  2. Compaction介绍

    Compaction介绍 Compaction是buffer->flush->merge的Log-Structured Merge-Tree模型的关键操作,主要起到如下几个作用: 1)合并 ...

  3. phpPgAdmin (win)配置安装及远程访问

    phpPgAdmin (win)配置安装 [1]     通过PostgreSQL的Application Stack Builder配置安装phpPgAdmin 1.确保PostgreSQL安装并正 ...

  4. Spring Boot入门(二)

    一.Spring Boot项目打包 1.引入maven打包相关插件 2.项目右击run as>Maven clean.run as>Maven install在target文件夹下会生成相 ...

  5. SQL索引工作原理

    SQL 当一个新表被创建之时,系统将在磁盘中分配一段以8K为单位的连续空间,当字段的值从内存写入磁盘时,就在这一既定空间随机保存,当一个8K用完的时候, SQLS指针会自动分配一个8K的空间.这里,每 ...

  6. SQL必知必会 记录

    登录数据库mysql -u root -p查看所有数据库  show databases:选择数据库  use 数据库名:查看所有表      show tables查看表结构      descri ...

  7. asp.net JS取值

    <script> $(function () { $.post("RegisterNew.aspx", { "ddlprovince": $(&qu ...

  8. poj 1185 状压dp+优化

    http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 291 ...

  9. js比较函数

    //1.//bySort函数接受一个首要比较字符串和一个可选的次要比较函数做为参数//并返回一个可以用来包含该成员的对象数组进行排序的比较函数//当o[firstName] 和 p[firstName ...

  10. pycharm配置PyQt5,以及创建第一个项目

    认你已经安装好了pycharm,也正确安装了PyQt5 否则,请移步https://www.cnblogs.com/longbigbeard/p/9628102.html来安装PyQt5 下一步,To ...