C语言基础-函数、指针

本文为关于C语音函数、全局变量、指针的部分知识点,偏向理论部分。

本文为本人学习笔记整理,如有不足,请与本人交流沟通。

函数

函数概述

C语言的程序模块称为函数,  利用函数可建立模块化程序。
函数是一个独立的具有特定功能的程序模块。
程序的“细化”开发方式使程序更易于管理, 提高程序的 可读性
软件的可重用性。
避免了在程序中使用重复的代码。
一个C程序可由一个主函数和若干个其他函数组成
程序执行时从main函数开始,  根据需要,  main函数调用其他函数,  其他函数也可以互相调用。
同一个函数可以被一个或多个函数调用任意多次。最后由main函数结束程序的运行。
不能调用 main函数

函数的分类
从用户的观点分为:
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种方法是指针移动法,  利用指针变量的自加操作,  使指针顺序指向下一元素,不必每次重新计算地址,因此执行效率高于前两种,且编程方便。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值