本文为关于C语音函数、全局变量、指针的部分知识点,偏向理论部分。
本文为本人学习笔记整理,如有不足,请与本人交流沟通。
函数
函数概述
函数类型 函数名(参数表) --函数头
{ --花括号中为函数体
数据说明
执行语句
}
函数类型
定义函数时,如果省略函数类型,则默认为int型。
return 的返回值表达式类型,需要跟定义的函数类型一致,假如类型不一致,会强制转换为函数类型,例如return z=1.2 函数类型为int 则最终返回结果为1。
定义函数时:变量作为形参(形式参数)为值传递
形参和实参都是变量的话,数据传递是赋值的过程,把实参赋值给形参进行运算,值传递。
定义函数时:数组作为形参为址传递
形参和实参都是数组名的话,是把地址传递过去,形参实参公用一块内存,址传递。
定义函数 int time(char a[ ].charb[ ]) 会退化成int time(char * a,char *b) char*a是指针变量,指针都是地址,属于址传递。
指针变量的大小,都为4个字节sizeof(char *b)=4
为了在被调用函数中处理数组元素的需要, 可另设一个参数传递数组元素的个数。提高函数可容性。
extern 外部变量,也称全局变量
对共用的外部变量可以在任一源文件中定义一次, 其他源文件中用extern对其声明后, 即可使用。
如果希望外部变量仅限于本文件使用, 则在定义外部变量时前面加一个static说明。
在同一源文件内, 对于使用在前, 定义在后的外部变量, 可以在使用前用关键字extern 加以声明(声明时不需值初始化或赋初值)。
由于外部变量先于main函数开辟内存,如果使用在前定义在后的话,需要用eatern先声明该变量为外部变量(即该值使用的是外部变量之前开辟的那块内存),
就可以使用了,满足先定义后使用的原则
在同一个源程序中, 若全局变量与局部变量同名,则在局部变量作用范围内, 全局变量不起作用, 即全局变量被“屏蔽”
内存中供用户使用的空间有三部分:程序区,静态存储区,动态存储区
static 函数类型 函数名(形参)
只能被本文件中的其他函数所调用的函数称为内部函数。
内部函数也称静态函数
内部函数不能被其他文件中的函数使用, 所以在不同文件中可以使用相同名字的内部函数。
static 静态变量
在局部变量前加上关键字static, 称为静态局部变量。
由于所有全局变量都是静态类的,C规定, 在定义全局变量时“static”可以省略。
1.如果全局变量前加static,则代表这个全局变量是这个源文件私有,其他源文件无法使用
2.在局部变量前加上static, 称为静态局部变量。函数调用结束时, 静态局部变量不会消失, 值仍保留, 每次函数调用时, 也不会为其重新分配空间,
它们在整个程序执行期间都不释放。
静态局部变量和全局变量一样, 只赋初值一次, 以后每次函数调用时使用上次函数调用结束时的保留值。
静态局部变量定义时如不赋初值,系统会自动对数值型静态局部变量赋初值0;对字符型赋初值空字符
静态局部变量仅能为本函数使用,其他函数不能使用和影响它们。
extern 函数类型 函数名(形参)
在一个文件内定义的函数, 也可以被其他文件内的函数调用, 这样的的函数称为外部函数。
在C语言中, 函数前如果无关键字extern, 隐含为外部函数。
在调用它的其他文件中, 用extern加函数原型来声明所用的函数是外部函数。
指针
指针: 就是变量的内存地址
指针变量: 就是存放另一变量内存地址(指针)的变量。
指针变量的类型:是指针所指向的变量的类型, 而不是自身的类型。
指针变量的类型与它所指向变量的类型必须一致
例:
int i = 10 定义int型变量i
int x = 0 定义int型变量 x
int *p=NULL 定义int*型(指针)变量p 初值为NULL NULL就0 0也是NULL美 [nʌl] 零值的; 等 于零的;
p=&i 将i的地址,赋予指针变量p 可以直接赋初值 int *p=&i
x=*p 将p所存地址里的值,赋予x
此时x的值为10
“&”取址取地址运算符
“*”取值 取指针变量里保存的地址里的值
野指针
如果使用一个没有确定值的指针变量, 不仅可能破坏你的程序, 而且可能导致系统的破坏。
关于数组指针
Int *p=NULL
int a[10]={1,2,3,4,5,6,7,8,9}
p=a; //这里数组名作为数组的起始地址, 即a[0]的地址。因此 p=a 等效于 p=&a[0]
p=p+1; //如p指向a[0], 则p=p+1之后,p指向a[1]
//如果p=a 等效于 p=&a[0]; 则 p=a+4 等效于 p=&a[4];
在C语言中,对数组元素的访问可用以下三种形式:
下标法: 用a[i]的形式存取数组元素
地址法: 用 *(a+i) 或 *(p+i) 的形式存取数组元素
指针法: 用指针变量指向数组的首地址, 然后通过移动指针*p++存取数组元素。
若访问下标为 i 的元素:
a[i] 等价于 *(a+i) 等价于 *(p+i) 等价于 p[i]
第3种方法是指针移动法, 利用指针变量的自加操作, 使指针顺序指向下一元素,不必每次重新计算地址,因此执行效率高于前两种,且编程方便。