<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 ...
随机推荐
- Magnetic Fingerprinting Approach to Indoor Localization
Magnetic Fingerprinting Approach to Indoor Localization
- java参数的值传递和引用传递
今天抽了点时间继续啃java核心基础,即使出来做web挺长时间了,始终觉得基础极其重要. 遇到了java参数的传递类型,豁然开朗之时不忘写下记录. java中采用的总是值传递,包括对对象参数的传递,采 ...
- 20170325 ABAP调用webservice
转自:http://www.cnblogs.com/SolisOculus/archive/2013/04/01/2993198.html 在ABAP中调用Webservice 1.创建Pro ...
- 【zabbix】微信告警消息模版
下面给出了一个zabbix微信告警消息的模版, 消息最后加上#号和短横线的设计有两个原因: 1,zabbix的微信告警消息总是被截断,比如最后一个告警时间,如果没有最后一行#号,在微信上看的时候时间不 ...
- IOS平台的几个推送服务的对比
http://blog.163.com/scuqifuguang@126/blog/static/171370086201399113833299/ 最近研究了一下极光推送(JPush) ...
- Android Weekly Notes Issue #319
Android Weekly Issue #319 July 22nd, 2018. Android Weekly Issue #319 本期内容包括: MotionLayout加动画; Kotlin ...
- 51Nod XOR key —— 区间最大异或值 可持久化字典树
题目链接:http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1295 1295 XOR key 题目来源: HackerRa ...
- js修改div标签中的内容
<div id='divId'>初始文字</div> <script> $(document).ready(function(e){ $('#divId').htm ...
- blog真正的首页
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上一节我们阐明了django的开发流程, ...
- 鸟哥的linux私房菜 - 第5/6/7/9章(在线求助 man page、Linux档案权限与目录配置、Linux档案与目录管理、压缩与打包)
第五章.在线求助 man page X window与文本模式的切换 Ctrl+Alt+F1~F6:文字接口登入tty1~tty6终端机: Ctrl+Alt+F7:图形接口桌面. 注销当前用户:exi ...