<c和指针>学习笔记3之函数和数组
1 函数声明
(1)原型
告诉编译器函数的参数数量和每个参数的类型以及返回值的类型。编译器通过检查原型之后,就可以检查这个函数得调用,从而来确保参数正确,返回值无误。
通用技巧,将原型写在一个头文件当中,需要他的包含进来就好了
func.h
int *func(int *value,int len)
func.c
#include "func.h"'
void a(){}
void b(){}
(2)函数的参数
c函数的所有参数都是"传值调用"方式进行传递,也就是函数将获得参数值的一份拷贝。注意,如果传递的参数是一个数组名,那么在函数中对数组元素进行修改实际上修改的是调用程序的数组元素。这样乍一看,不是和均为传值调用矛盾了吗,其实非也,数据名实际上是指针,传递给函数的是这个指针的拷贝。
这里就出现了经常说到的swap交换函数,想要交换就需要传地址。
2 递归
两个条件
存在限制条件,当符合这个条件的时候递归不再继续
每次递归调用之后越来越接近这个限制条件
3 可变参数列表
让一个函数在不同的时候接受不同数目的参数。
(1)stdarg宏
可变参数列表是通过宏来实现,宏定义位于stdarg.h。声明了一个类型va_list和三个宏,va_start,va_arg,va_end。咋们可以声明一个va_list变量和这几个宏配合使用。
#include <stdarg.h>
float average(int n_values,...)
{
va_list var_arg;
int count;
float sum = ;
//准备访问可变参数
va_start(var_arg,n_values); //添加取自可变参数列表的值
for(count=;count<n_values;count+=){
sum+=va_arg(var_arg,int) } //完成处理可变参数
va_end(var_arg);
return sum/n_values;
}
3 数组
数组名的值是一个指针常量,也就是数组第一个元素的地址。
int a[10]
int *p = &a[0];//等价于c=a
(1)下标引用
*(b+3) 这里注意,b是一个指向整型的指针,加法运算的结果是另一个指向整型的指针,所以这里是数组第一个元素向后移动3个整数长度的位置,然后间接访问。
除了优先级以外,下标引用和间接访问完全相同。例如
array[sub]
*(array+(sub))两者相同
(2)字符串常量和字符数组
char message[]="hello"
char *message="hello"//message指向这个字符串常量的存储位置
(3)多维数组
多维数组的元素存储顺序按照最右边的下标率先变化的原则,也就是行主序。比如
[0,0],[0,1],[0,2],[1,0],[1,1],[1,2] a[0][2]
多维数组的第一维的元素实际上是另一个数组
int matrix[3][10]
matrix看作一个一维数组包含三个元素,知识每个元素恰好是包含10个元素的数组。所以matrix指向第一个元素的指针,也就是指向一个包含数个元素数组的指针。
下标
实际上是一种间接访问表达式的伪装形式
matrix+1 也是一个指向包含是个整型元素的指针,也就是下一行 等价于*(matrix+1)
例子:
访问matrix[1][5]
*(*(matrix+1)+5)==*(matrix[1]+5)
指向数组的指针
int matrix[3][10];
int (*p)[10]=matrix;//下标的引用优先级高于间接访问 p指向matrix第一行,p是一个指向拥有十个整型元素的数组的指针,当p和一个整数相加的时候,实际上是一行一行的移动。如果需要一个指针逐个访问整型元素而不是逐行移动,方法如下。
int *pi=&matrix[0][0]
int *pi=matrix[0]
初始化
int mat[2][3]={1,2,3,4,5,6}相当于
mat[0][0]=1,mat[0][1]=2,mat[0][2]=3
mat[1][0]=4,mat[1][1]=5,mat[1][2]=6
数组长度自动计算
在多维数组中只有第一维才能根据初始化列表提供缺省,剩下的几维必须显示写出,这样子编译器才能推断每个子数组的长度
int two_min[][5]={{00,01,02},{10,11}} 这样可以
int two_min[4][] NO
指针数组
int *api[10] 下标引用的优先级高于间接访问
<c和指针>学习笔记3之函数和数组的更多相关文章
- C++中的智能指针、轻量级指针、强弱指针学习笔记
一.智能指针学习总结 1.一个非const引用无法指向一个临时变量,但是const引用是可以的! 2.C++中的delete和C中的free()类似,delete NULL不会报"doubl ...
- ES6学习笔记<三> 生成器函数与yield
为什么要把这个内容拿出来单独做一篇学习笔记? 生成器函数比较重要,相对不是很容易理解,单独做一篇笔记详细聊一聊生成器函数. 标题为什么是生成器函数与yield? 生成器函数类似其他服务器端语音中的接口 ...
- Go语言学习笔记七: 函数
Go语言学习笔记七: 函数 Go语言有函数还有方法,神奇不.这有点像python了. 函数定义 func function_name( [parameter list] ) [return_types ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
- Typescript 学习笔记三:函数
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- OpenCV 学习笔记03 findContours函数
opencv-python 4.0.1 1 函数释义 词义:发现轮廓! 从二进制图像中查找轮廓(Finds contours in a binary image):轮廓是形状分析和物体检测和识别的 ...
- canvas学习笔记、小函数整理
http://bbs.csdn.net/topics/391493648 canvas实例分享 2016-3-16 http://bbs.csdn.net/topics/390582151 html5 ...
- JavaScript:学习笔记(5)——箭头函数=>以及实践
JavaScript:学习笔记(5)——箭头函数=>以及实践 ES6标准新增了一种新的函数:Arrow Function(箭头函数).本文参考的链接如下: MDN箭头函数:https://dev ...
随机推荐
- http协议详解-经典篇
本文转载至 http://www.cnblogs.com/flychen/archive/2012/11/28/2792206.html ————————————————————————————— ...
- iOS 跳转到Appstore的链接及二维码
1.应用内部跳转到Appstore 1.跳转到应用详情 [[UIApplication sharedApplication]openURL:[NSURL URLWithString:@"it ...
- stacked generalization 堆积正则化 堆积泛化 加权特征线性堆积
https://en.wikipedia.org/wiki/Ensemble_learning Stacking Stacking (sometimes called stacked generali ...
- 流畅的python学习笔记第八章:深拷贝,浅拷贝,可变参数
首先来看赋值,浅拷贝,深拷贝. 一赋值: a=['word',2,3] b=a print id(a),id(b) print [id(x) for x in a] print [id(x) for ...
- ABAP screen
Instance One : SELECTION-SCREEN BEGIN OF BLOCK B1 WITH FRAME TITLE TEXT-100. SELECTION-SCREEN BEGIN ...
- MV45AOZZ 销售订单增强点
[转自 http://blog.csdn.net/zhongguomao/article/details/6712580]choose the table VBAP or VBAK ( dependi ...
- X86汇编 BT
位操作指令位操作指令包括位测试和位扫描指令,可以直接对一个二进制位进行测试,设置和扫描. 1位测试和设置指令 格式:BT DEST,SRC BTC DEST,SRC BTR DEST,SRC BTS ...
- SQL 中GROUP BY 、ROLLUP、CUBE 关系和区别
转自:http://www.cnblogs.com/dyufei/archive/2009/11/12/2573974.html 不言自明,看SQL就完全理解了,不需要过多解释,不错,分享之: ROL ...
- 怎么样写一个能告诉你npm包名字是否被占用的工具
事情是这样的: 因为我经常会写一些npm包,但是有时候我写完一个包,npm publish 的时候却被提示说包名字被占用了,要不就改名字,要不就加scope,很无奈.npm 命令行可以通过 npm v ...
- 发现eclipse红叉,查看markers发现Target runtime Apache Tomcat v8.0 is not defined
导入以前的项目(Markers中注意查看,就在console选项卡旁边),报以下错误,但不影响操作: Faceted Project Problem Target runtime Apa ...