C语言学习笔记--数组参数和指针参数
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语言学习笔记--数组参数和指针参数的更多相关文章
- C语言学习笔记--数组指针和指针数组
C 语言中的数组有自己特定的类型,数组的类型由元素类型和数组大小共同决定.(如 int array[5]类型为 int[5]) 1.定义数组类型 C 语言中通过 typedef 为数组类型重命名:ty ...
- c语言学习笔记(9)——指针
指针是c语言的灵魂 ----------------------------------------------------------------------------- # include &l ...
- GO 语言学习笔记--数组切片篇
1.对于make 数组切片,长度和容量需要理解清楚: 容量表示底层数组的大小,长度是你可以使用的大小: 容量的用处在哪?在与当你用 appen d扩展长度时,如果新的长度小于容量,不会更换底层数组,否 ...
- c语言学习笔记 —— 数组
1. 数组的内存分配原理. 数组定义 int a[3] = {1,3,11}; 如下写法是错误的: int number; int a[number] = {1,7,9}; 原因是:没有定长的数组初 ...
- 大一C语言学习笔记(9)---指针篇--从”内存的使用“和“流程控制”的角度来理解“指针变量的使用‘
#深入理解指针变量 举个错误栗子: //以下代码的目的是输出100和1000,但输出结果只有一个100 #include<stdio.h> #include<malloc.h> ...
- 大一C语言学习笔记(7)---指针篇--什么是指针?什么是指针变量?取地址符“&”的作用是什么?地址运算符“*”的作用是什么,怎么理解两者?
"指针是C语言的灵魂"这句话一开始我没怎么明白,现在接触了指针,终于知道为什么这么说了,因为....难,真难:下面说一下我对这句话的见解: C语言拥有着其他语言所没有的特性---直 ...
- c语言学习笔记.数组.
数组: 可以存储一个固定大小的相同类型元素的顺序集合,比如int类型的数组.float类型的数组,里面存放的数据称为“元素”. 所有的数组都是由连续的内存位置组成.最低的地址对应第一个元素,最高的地址 ...
- 大一C语言学习笔记(8)---指针篇--动态内存是什么?与静态内存有什么区别?怎么使用动态内存,有什么需要注意的地方?
静态内存指的是在编译时系统自动给其分配的内存,运行结束后会自动释放:静态内存是在栈中分配的: 动态内存是我们程序员手动分配的内存,正常情况下,程序运行结束后,也不会自动释放,所以为了避免发生未知的错误 ...
- Go语言学习笔记九: 指针
Go语言学习笔记九: 指针 指针的概念是当时学C语言时了解的.Go语言的指针感觉与C语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
随机推荐
- codevs 2800 送外卖 TSP问题
2800 送外卖 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题目描述 Description 有一个送外卖的,他手上有n份订单,他要把n份 ...
- Python之单例模式总结
一.单例模式 a.单例模式分为四种:文件,类,基于__new__方法实现单例模式,基于metaclass方式实现 b.类实现如下: class Sigletion(objects): import t ...
- centos:rpm安装,软件安装
1,先检查 软件包是否存在: 以parted命令为例: rpm -qa|grep parted 2.如果没有,则安装: yum install parted
- 无法锁定管理目录(/var/lib/dpkg/),是否有其他进程正占用它
dpkg应用程序被占用 错误提示: E: 无法获得锁 /var/lib/dpkg/lock – open (11: 资源暂时不可用) E: 无法锁定管理目录(/var/lib/dpkg/),是否有其他 ...
- 自己动手写一个U盘拷贝小工具
这是五一期间,参照知乎上一篇的文章<十行代码--用python写一个USB病毒>写成的,最初只是单纯的想写成死循环,直到文件占满硬盘为止,第一个遇到的问题是,拷贝到硬盘之后,由于要无限次拷 ...
- iOS-使用ALAssetsLibrary获取相册图片视频
用ALAssetsLibrary获取相册图片视频 ALAssetsLibrary *library = [[ALAssetsLibrary alloc] init]; [library enumera ...
- 分布式_理论_03_2PC
一.前言 五.参考资料 1.分布式理论(三)—— 一致性协议之 2PC 2.分布式理论(三) - 2PC协议
- 本地安装phpcms步骤
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/u012145816/article/details/72183032 http://download ...
- hdoj-3342-Legal or Not(拓扑排序)
题目链接 /* Name:hdoj-3342-Legal or Not Copyright: Author: Date: 2018/4/11 15:59:18 Description: 判断是否存在环 ...
- pcre函数详解
PCRE是一个NFA正则引擎,不然不能提供完全与Perl一致的正则语法功能.但它同时也实现了DFA,只是满足数学意义上的正则. PCRE提供了19个接口函数,为了简单介绍,使用PCRE内带的测试程序( ...