指针变量做函数的参数:
我们用一个例子来说明:交换两个变量的值
上面例子从打印信息可以看出,交换失败,为啥会交换失败呢?对于实参int a, int b实质是函数my_swap的局部变量,只是在调用的时候x,y分别将值赋给a,b,而x,y本身的值是没有变的,该过程只是对a,b进行了交换。
再来看一个例子:
可以看出,my_swap()中的形参int *a,int *b是两个指针变量,在调用my_swap()时,a,b分别指向变量x,y的地址,此时的交换是变量x,y的地址的内容交换,当然交换成功。
数组名作函数的参数:
一维数组名作函数的参数,一下两种写法都可以
- 第一种方式:
- 第二种方式:
数组做形参时,无需指定其下标,(其实a[i]只是*(a+i)的一种简写)。
这里需要注意一点,数组做行参时,无论传递的数组包含10个元素还是包含100个元素,传递的都是数组的地址,下面例子可以看出数组a[10]做参数,在函数内部使用sizeof(a)结果不是10,而是4(指针占用四个字节空间)。
二维数组名作函数的参数:
- 二维数组名作为参数,行可以不写出来,列必须写出来,如:
- 数组指针作形参,完全等价于二维数组的应用
指向函数的指针(函数指针):
一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。
其声明格式为:返回值类型 (*fun_ptr)(参数列表)
如 int (*p)(int a, int b); p是一个指针变量,它指向一个函数,这个函数有2个整型参数,函数返回值类型为int。p首先和*结合,说明p是一个指针,然后再与()结合,说明它指向的是一个函数,指向函数的指针即为函数指针。
来看个例子:
指向函数的指针(函数指针):
一个函数在编译时被分配一个入口地址,这个地址就称为函数的指针,函数名代表函数的入口地址。
其声明格式为:返回值类型 (*fun_ptr)(参数列表)
如 int (*p)(int a, int b); p是一个指针变量,它指向一个函数,这个函数有2个整型参数,函数返回值类型为int。p首先和*结合,说明p是一个指针,然后再与()结合,说明它指向的是一个函数,指向函数的指针即为函数指针。
来看个例子:
函数指针的应用--回调函数:
函数指针变量常用的用途之一是把函数的指针作为参数传递到其他函数,当这个指针被用来调用其所指向的函数时,即为回调。
比如一个函数test,在调用它的时候,根据传入参数的不同实现不同的功能,输入a和b两个数,第一次调用test时找出a和b中大者,第二次找出其中小者,第三次求a与b之和等。看下面一个例子:
返回指针值的函数:指针函数
返回指针的函数:一个函数可以返回一个整型值、字符值、实型值等,也可以返回指针型的数据,即地址;
定义形式为:类型名 *函数名(参数表列); 例如:int *a(int x,int y); 注意与指针函数int (*a)(int x,int y)不同。
注意:在调用时要先定义一个适当的指针来接收函数的返回值,这个适当的指针其类型应为函数返回指针所指向的类型。
- 例:pc = (char *)malloc(100);
- 表示分配100个字节的内存空间,并强制转换为字符数组类型,函数的返回值为指向该字符数组的指针,把该指针赋予指针变量pc
- char *pc=NULL;
- pc = (char *)malloc(100);
- void类型的指针
- void指针是一种很特别的指针,并不指定它是指向哪一种类型的数据,而是根据需要转换为所需数据类型。
如上面的例子,不指定指针变量p具体指向哪一种类型的数据,而是根据需要转换为所需数据类型。
指针相关内容到此结束啦,后续内容开始写字符、字符串处理方面内容,想了解的小伙伴们请关注。