<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 ...
随机推荐
- cmake policy
1 cmake policy是什么? cmake policy可以理解为cmake的语法标准,也就是说,它规定了cmake在解析CMakeLists.txt文件时的行为. 2 cmake policy ...
- iOS 打包Framework包含其他Framework的问题
当你打包一个framework静态库包含另一个第三方静态库时,在工程中使用自己打包的framework,这时编译会出现报错,报错的大概原因是没有找到你打包framework里面的第三方framewor ...
- Facebook Gradient boosting 梯度提升 separate the positive and negative labeled points using a single line 梯度提升决策树 Gradient Boosted Decision Trees (GBDT)
https://www.quora.com/Why-do-people-use-gradient-boosted-decision-trees-to-do-feature-transform Why ...
- SVM怎样解决多分类问题
从 SVM的那几张图能够看出来,SVM是一种典型的两类分类器.即它仅仅回答属于正类还是负类的问题.而现实中要解决的问题,往往是多类的问题(少部分例外,比如垃圾邮件过滤,就仅仅须要确定"是&q ...
- Python爬虫一些操作headers与cookies的便捷工具
本篇文章主要是爬虫中常用的便捷处理方法整理,转载请注明出处 #!/usr/bin/env python # -*- coding: utf-8 -*- # @Date : 2018-08-14 13: ...
- 原生js基础学习--正则RegExp
转义字符"\" 使用反斜杠之后,会强制的将"\"之后的字符取消掉原来的意思转换成文本, 转义符号不会输出 var str= "abc\"de ...
- [egret+pomelo]实时对战游戏杂记(5)
之前大体了解了pomelo服务端的运行的大体运行流程,下面详细的学习一下在服务端比较重要的一个容器模块bearcat,在bearcat的wiki中我们可以对其有个大概的了解,在服务端示例的代码中也大量 ...
- BZOJ 1605 [Usaco2008 Open]Crisis on the Farm 牧场危机:dp【找转移路径】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1605 题意: 平面直角坐标系中,有n个点,m个标记(坐标范围1~1000). 你可以发出口 ...
- 2017SN多校D1T1 loveletter:模拟
题意: 两张n*m的纸.一张透明纸,上面有些地方是黑的,有些地方是透明的.另一张纸上写满了字母. 你需要将透明纸放在写字的纸上,分别顺时针旋转0°.90°.180°.270°,每次从上到下.从左到右写 ...
- html5--2.10综合实例2-移动端页面练习
html5--2.10综合实例2-移动端页面练习 学习要点 通过一个简单的移动手机页面,复习学过的内容 手机网页的测试 手机布局的屏幕设定 手机网页的测试方法 直接在手机上测试,比较麻烦,效果好 电脑 ...