<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 ...
随机推荐
- python 基础 7.8 json--下
一. 文件和json 之间的转换 1. json.dump() #/usr/bin/python #coding=utf-8 #@Time :2017/11/13 0:12 #@Authe ...
- 校验时间冲突SQL写法
校验时间是否有冲突,时间是就是看两个时间断是否有交集(写法有两种): a.SELECT * FROM xxx WHERE (startTime > a AND startTime < b) ...
- python网络爬虫之使用scrapy自动登录网站
前面曾经介绍过requests实现自动登录的方法.这里介绍下使用scrapy如何实现自动登录.还是以csdn网站为例. Scrapy使用FormRequest来登录并递交数据给服务器.只是带有额外的f ...
- c#中多线程写DataGridView出现滚动栏导致程序卡死(无响应)的解决的方法
版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/u013529927/article/details/24225567 由于写的程序涉及到多线程维护一 ...
- 使用 Nginx 提升网站访问速度(转)
Nginx 简介 Nginx ("engine x") 是一个高性能的 HTTP 和 反向代理 服务器,也是一个 IMAP/POP3/SMTP 代理服务器. Nginx 是由 Ig ...
- spring-boot2代码
App.java package com.kfit; import org.springframework.boot.SpringApplication; import org.springframe ...
- jQuery/CSS3实现Android Dock效果
在线演示 本地下载
- sudo执行提示Command not found
运行一命令在普通用户下可行,切换到root用户依然可行,但在普通用户下使用sudo执行时,提示Command not found. 修改/etc/sudoers文件,找到类似下面的一行: Defaul ...
- BZOJ 1492 货币兑换 Cash CDQ分治
这题n2算法就是一个维护上凸包的过程. 也可以用CDQ分治做. 我的CDQ分治做法和网上的不太一样,用左边的点建立一个凸包,右边的点在上面二分. 好处是思路清晰,避免了凸包的插入删除,坏处是多了一个l ...
- 让django完成翻译,迁移数据库模型
声明:此Django分类下的教程是追梦人物所有,地址http://www.jianshu.com/u/f0c09f959299,本人写在此只是为了巩固复习使用 上篇我们完成了数据库模型的代码,但是还只 ...