c语言的学习,比较难的是指针的用法,指针搞不明白,那说明没有学好c语言。
下面将举例说明指针的一些用法,包括指针数组、数组指针、指针函数、函数指针和函数指针数组。
1. 指针
通常说所的指针是指针变量的简称,指针变量存放的是内存单元的地址,在32位处理器中地址是32位的,所以所有类型的指针都占32位即4字节。
一级指针存放非指针变量的地址,二级指针存放一级指针变量的地址。
下面来看一段程序:
数组名a代表&a[0],是一个地址常量,对数组的操作本质是对指针的操作。i[a]这种写法也是可以的,i[a]等价于*(i+a),即*(a+i)。
2.指针数组
我们来看一个程序
数组a和数组p的区别在于数组a的每个元素都是整型变量,而数组p的每个元素都是整型指针变量。
给元素赋值:
数组p的每个元素存放数组a的元素的地址。
编译运行程序的结果是:
3. 数组指针
先看一个程序
这里p是数组指针,p指向的对象是具有10个元素的一维数组。注意p指向的对象一维数组,因此存放的必须是一维数组整体的地址,程序中的“p = &a”不能改为“p = a”,数组名代表首元素的地址,即a等价于&a[0]。
程序运行结果:
现在我们来看看另外一个程序。
指针p指向的是一维数组,因此要把一维数组的地址赋给p,赋值语句“p=a”把二维数组a的首元素地址&a[0]赋值给p,a[0]是一维数组,这是正确的。可以把p等价于a使用,最后用6种方式输出二维数组a的所有元素,结果如下:
4. 指针函数
指针函数是指返回值是地址的函数,例如:
函数fun的返回值是整型指针。
5. 函数指针
函数指针是指向函数的指针,下面看一个程序。
定义语句“int (*p)(int x, int y)”定义了p是指向具有两个整型参数,并且返回值是整型的函数的指针。然后把具有两个整型参数,并且返回值是整型的函数fun赋给p,这样p就指向函数fun的入口地址,使用时传入相应的参数。
这个程序的运行结果如下:
6. 函数指针数组
函数指针数组是多个相同类型函数指针的集合,下面看一个程序。
定义语句“ int (*p[2])(int x, int y);”定义了一个函数指针数组,数据p有两个元素,p[0]是一个指向具有两个整型参数,并且返回值是整型的函数的指针。然后把具有两个整型参数,并且返回值是整型的函数fun1赋给p[0],这样p[0]就指向函数fun1的入口地址,使用时传入相应的参数。