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语言的没啥不同. 指针定义与使用 指针变量是保存内存地址的变量.其他变量保存的是数值,而指针变量保存的是内存地址.这 ...
随机推荐
- STL视频_01
ZC:这里视频里面有一个调试小技巧,VS08/VS2010开始,控制台程序会自动退出(不像VC6),那么可以在 函数退出的最后一句语句上设置断点,然后查看控制台打印出来的信息.ZC:这一讲,给我的感觉 ...
- rapidjson代码封装类
rapidjson代码封装类 以下代码封装了rapidjson增删改查等基本操作: /********************************************************* ...
- c++中的函数对象
头文件wuyong.h: #pragma once #include<iostream> using namespace std; template<typename T> s ...
- Spring Boot入门——邮件发送
1.引入依赖 <!-- mail依赖 --> <dependency> <groupId>org.springframework.boot</groupId& ...
- dp2--合并石子(一)
dp2--合并石子(一) 一.心得 二.题目 石子合并(一) 时间限制:1000 ms | 内存限制:65535 KB 难度:3 描述 有N堆石子排成一排,每堆石子有一定的数量.现要将 ...
- ODPS中的TaskContext类里面的write函数
ODPS中的TaskContext类有几个write函数 write(Record record)用来输出到默认输出表 write(Record record, String label)用来输出的l ...
- 2017-03-04 dotnet core网站发布到Linux系统中
今天开始学习dotnet core的开发,距离Visual Stuio 2017正式版的发布,也就是VS20周岁的生日还有三天,在我的电脑上安装的是VS2017 Enterprise RC版, 在VS ...
- Eclipse 快捷键大全(群里共享的,留下来以后兴许会用到)
Eclipse快捷键大全Ctrl+1 快速修复(最经典的快捷键,就不用多说了)Ctrl+D: 删除当前行 Ctrl+Alt+↓ 复制当前行到下一行(复制增加) Ctrl+Alt+↑ 复制当前行到上一行 ...
- git公私钥的拷贝
1.场景 由于我换了一台电脑,为了能访问远程仓库,我就把原来电脑上的私钥和config文件拷贝过来 2.出现问题及解决方案 git clone server:xxx_service_express 报 ...
- Java 输入参数并求和
题目要求: 输入若干的参数,编写一个程序求出参数的和: 程序流程: 代码: 例子: