本周进行了第一周相关C语言的学习,主要学习了相关指针与函数相关的知识。本着温故而知新的原则,对本周学习内容进行总结。
一、指针
1、一维数组指针
首先因为指针指向的是地址而不是具体的值的作用,所以他一般多应用在数组中。因为数组的地址多为连续的,此时一个指针,通过对指针的不同操作即可达到对该数组的操作。
指针定义格式为:
数据类型 * 变量名=数组名/&数组首元素,例如:
int *p =a;
int *p=&a[0];
其中a与&a[0]均表示数组首元素的起始地址,&a[i]与a+i表示第i个元素的起始地址,该地址的大小在32位机中为4个字节,在64位机中为8个字节,&a表示整个数组的起始地址,&a+1增加的即为一个数组的地址长度其与a+1是不同的。
2、二维数组指针
int a[3][4]={0};
int *p=a;
此时数组首元素起始地址的表示方式为:
&a[0][0],&a[0]+0,*(p+0)+0
数组首行起始地址的表示方式为:
a,p
a与p的区别为,a是数组名是一个常量,p是变量,a是不可改变的
3、野指针
当定义一个指针,但指针没有指向的时候,则该指针称为野指针,操作该野指针会导致
数值与不确定的变化,所以应避免野指针的存在;
当不确定指针指向时,应将指针指向NULL,防止野指针的出现,此时若操作野指针则
只会出现段错误,该指针不能操作;
一维数组与二维数组异同理解:
一维数组中a表示数组首元素的起始地址,二维数组中a表示元素内一个数组的起始地址,当定义数组指针p时,对一维数组为p=&a,二维数组为p=a,另外定义指针而非数组指针时,对一维数组应定义p=a 其中&a与a均表示一数组的起始地址
4、数组指针
数组指针为指向一个数组(一般为二维数组中的一维数组)的指针,格式为:
类型名 (*指针变量名)[整形常量]
例如:
int a[3][4]={1,2,3,4,5,6,7,8,9,10,11,12};
int (*p)[4];
表示p可以指向a、a+1、a+2,但不能指向一维数组具体元素
5、指针数组
如: char* p[4];
表示一个字符型数组,数组元素时字符数据的指针
二、函数
函数可以把相对独立的某个功能抽象出来,使他成为一个独立实体,方便在同一个程序中多次调用;
函数的优点:
(1)、使程序变得更简短且清晰明了;
(2)、有利于程序维护;
(3)、可以提高程序开发效率;
(4)、提高代码的普适性,以及能多次重复使用;
1、内置函数
由C语言系统提供,无需额外定义,只需要在使用时包含该函数定义的头文件即可;
2、用户定义函数
(1)函数定义
函数定义需要由返回值类型 函数名(形参)以及函数主体构成,例如:
double max(double x,double y)
{
double temp;
temp=x>y?x:y;
return temp;
}
这就是一个求X,Y之中较大的值,并返回该较大值的一个函数;
(2)函数声明
声明在原型上与函数头部类似,放在头文件说明以下,调用函数之前如:
double max(double x,double y);
(3)函数调用
函数调用本质是一个中断,先保护现场,接下来给要调用的函数形参申请空间,将实参的数赋给形参空间,跳入函数内部执行 之后将结果返回到一个临时空间内,恢复现场
使用方法例如:
int main()
{
int max;
max=max(2,3);
}
调用也可在定义的函数里调用别的函数,称为函数的嵌套调用 ;
当在一个函数内调用自身,则称为递归调用,该调用一定要有出口;
(4)函数的形参和实参
如上例中,double x,double y称为形参,2,3称为实参;
这种传递称为数值传递,当传递的为指针或数组名时,则称为地址传递;
(5)函数指针
一个函数在编译时,有一个入口地址,即该函数的指针,例如:
int (*p)(int ,int);
p=max;
函数指针的值就是指针所指向函数的返回值;
(6)二级指针
int **p;
**p是一个整形变量值;
*p是一个指向整形变量的指针
p是一个指向整形变量的指针的指针