<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 ...
随机推荐
- go test 上篇
前言 Go语言本身集成了轻量级的测试框架,由go test命令和testing包组成.包含单元测试和压力测试,是保证我们编写健壮Golang程序的有效工具. 演示环境 $ uname -a Darwi ...
- EasyPlayerPro windows播放器在播放RTMP视频显示重复异常问题解决
问题来源 2017.12.18 今日有杭州某教育领域客户反馈EasyPlayerPro在播放一个rtmp源时,画面显示异常的问题.截图如下: 问题复现 一番思考, 将显示格式改为D3D显示, 正常, ...
- 九度OJ 1175:打牌 (模式匹配)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:8156 解决:1560 题目描述: 牌只有1到9,手里拿着已经排好序的牌a,对方出牌b,用程序判断手中牌是否能够压过对方出牌. 规则:出牌 ...
- 九度OJ 1164:旋转矩阵 (矩阵运算)
时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:3188 解决:1245 题目描述: 任意输入两个9阶以下矩阵,要求判断第二个是否是第一个的旋转矩阵,如果是,输出旋转角度(0.90.180. ...
- Grunt学习笔记【7】---- grunt-contrib-less插件详解
本文主要讲如何使用Grunt实现less文件压缩. 一 说明 less是非常常用的样式框架之一,Grunt也提供了可以编译和打包less样式文件的插件:grunt-contrib-less. 实现原理 ...
- 修正IE6中FIXED不能用的办法,转载
.fixed-top /* 头部固定 */{position:fixed;bottom:auto;top:0px;} .fixed-bottom /* 底部固定 */{position:fixed;b ...
- android 服务与多线程
android服务是执行在UI主线程的.一下是代码demo: package com.example.testservice; import android.os.Bundle; import and ...
- g2o的一般过程
1.自己定义顶点类.边类或者用已经有的.1.1定义顶点例子class CurveFittingVertex: public g2o::BaseVertex<3, Eigen::Vector3d& ...
- POJ2278 DNA Sequence —— AC自动机 + 矩阵优化
题目链接:https://vjudge.net/problem/POJ-2778 DNA Sequence Time Limit: 1000MS Memory Limit: 65536K Tota ...
- 机器学习:Selective Search for Object Recognition
今天介绍 IJCV 2013 年的一篇文章,Selective Search for Object Recognition,这个是后面著名的DL架构 R-CNN 的基础,后续介绍 R-CNN 的时候, ...