2016.9.6 DAGE
C语言深度剖析笔记(六)
a.指针数组与数组指针
1.定义:
首先要注意[]的优先级要高于*,所以下面
int *p[4];
int (*p)[4];
可以看做上面的先定义了一个数组,但是数组里面存放的是一些指针,并且数组里面可以存放除了函数以外的任意类型的数据
下面的因为()的原因所以先定义了一个指针,但是这个指针指向的是一个数组,并且后面[4]限定了指向的数组的大小2.应用:
b.数组传参
1.参数类型:
参数分为形参和实参。
形参是指声明或定义函数时的参数,而实参是在调用函数时主调函数传递过来的实际值。2.传参:
所有非数组形式的数据实参均以传值形式(对实参做一份拷贝并传递给被调用的函数,函数不能修改 作为实参的实际变量的值,而只能修改传递给它的那份拷贝)调用。3.一维数组传参:
当一维数组作为函数参数的时候,编译器总是把它解析成一个指向其首元素首地址的指针。
所以使用sizeof求大小时求出来的是一个地址的大小4字节
可以使用两种形式来进行传参:
void fun(int a[10])
void fun(int *a)
都可以对原本的数组进行操作。4.一级指针传参:
一级指针传参传过去的并不是原本的实参,而是对原本的实参进行一份拷贝传递给函数。
所以如果在函数中对这个一级指针进行操作,比如赋值或者分配空间,那么一般不会影响到原本主函数里面的一级指针的大小、内容等。如果想在函数中的操作在主函数里面保留,那么有两种办法:- <1>.使用函数返回值的方式将这个指针再返回回来,并且将返回的指针赋值给原指针;
注意函数的返回值类型要和指针类型相同 char *fun(int *p) - <2>.使用二级指针的方式,这样可以不用返回处理
注意:要对一个主函数里的变量进行函数内部操作并且主函数需要这种操作后的改变的数据,那么可以用一级指针来进行传值操作,要对一个一级指针进行操作可以使用二级指针类等。
- <1>.使用函数返回值的方式将这个指针再返回回来,并且将返回的指针赋值给原指针;
c.函数指针
1.定义:
char * (*fun)(int a,int b);
第一个括号前面的表示的是函数的返回值类型,第一个括号里面内容是这个指针名字*p,第二个括号里面内容是函数的参数的类型。2.使用:
char *(*fun)(int a,int b);
fun = &Myfun; //这里的Myfun是一个已经定义好的函数名字,&可以不要
(*fun)(3,5); //要注意这里的(),因为如果不加左边的括号会优先fun(),而不是*fun。
//也可以fun(3,5);的格式/*
显示器: 1.5k CPU: 2k 显卡: 2k 机械硬盘: 0.7k 固态硬盘: 0.5k 内存: 0.4k 主板: 0.8k 风扇: 0.1k 电源: 0.3k 键盘: 0.3k 鼠标: 0.2k 机箱: 0.2k 周边: 0.2k
*/
买电脑–