- 前言
- 一、指针是什么?
- 二、指针变量
- 三.指针数组
- 四、数组指针
- 五、函数指针
- 六、函数指针数组
- 七、指向函数指针数组的指针
- 总结
前言
C语言是人与计算机交流的一种语言,它既有高级语言的特点,又具有汇编语言的特点。C语言引入指针是它显著优点之一,善于利用指针可以提高程序效率,用程序更加简洁,高效。这也是为什么说指针是C语言的灵魂。下面汇总一些指针具体点用法。
一、指针是什么?
内存是由一个又一个的字节组成的,每一个字节对应一个地址编号。在程序中定义一个整形变量a,系统就会给程序分配四个字节大小的内存空间,每一个字节会有一个相对应的地址编号,通过首地址编号就可以找到这个整形变量a,可以说,这个首地址就是指向这个整形变量,所以将地址形象化的称为“指针”。
二、指针变量代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 10;//定义一个整形变量a int* pa = &a;//将a的地址存放到指针变量pa中 printf("%dn", *pa); return 0; }
程序运行结果:
指针变量pa,里面存放的是整形变量a的地址。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int a = 10; int b = 20; int i = 0; int* parr[2] = { &a,&b };//将整形变量a和b的地址存放到指针数组parr中 for (i = 0; i < 2; i++) { printf("%d ", *(parr[i])); } return 0; }
程序运行结果:
指针数组parr本质上是一个数组,这个数组存放了两个元素,每个元素中又存放了一个整形变量的地址。
四、数组指针代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint main() { int arr[2] = {10,20};//定义一维数组 int(*p)[2] = &arr;//将数组地址赋给指针变量p int i = 0; for (i = 0; i < 2; i++) { //printf("%d ", (*p)[i]); //printf("%d ", *(*p+i)); //printf("%d ", arr[i]);//*p==arr printf("%d ", *(arr+i)); } return 0; }
程序运行结果:
数组指针p本质上是一个指针,里面存放的是arr数组中所有元素的地址,这个数组有两个元素,每个元素中存放的是一个int类型的数值。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint Add(int x, int y)//定义一个Add函数 { return x + y; } int main() { int a = 10; int b = 20; int (*p)(int, int) = Add;//将函数地址Add赋给指针变量p printf("%dn", (*p)(a, b)); return 0; }
程序运行结果:
函数指针本质上是一个指针,这个指针变量里面存放的是一个函数的地址。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint Add(int x, int y)//定义Add函数 { return x + y; } int Sub(int x, int y)//定义Sub函数 { return x - y; } int main() { int a = 10; int b = 20; int i = 0; int (*parr[2])(int, int) = { Add,Sub };//将Add和Sub函数地址赋给函数指针数组parr for (i = 0; i < 2; i++) { printf("%d ", (*parr[i])(a, b)); } return 0; }
程序运行结果:
函数指针数组本质上是一个数组,数组里面存放两个元素,每个元素中又存放了一个函数的地址。
代码如下(示例):
#define _CRT_SECURE_NO_WARNINGS 1 #includeint Add(int x, int y)//定义Add函数 { return x + y; } int Sub(int x, int y)//定义Sub函数 { return x - y; } int main() { int a = 10; int b = 20; int i = 0; int (*parr[2])(int, int) = { Add,Sub };//函数指针数组 int (*(*p)[2])(int,int) = &parr;//指向函数指针数组的指针 for (i = 0; i < 2; i++) { printf("%d ", (*pparr)[i](a, b)); } return 0; }
程序运行结果:
p是一个指针变量,这是一个指向函数指针数组的指针,意思是这个指针里面存放的是函数指针数组的地址,这个数组又有两个元素,每个元素中存放的又是一个函数的地址。
指针功能强大,同时它的使用方法也有很多种,所以理清各个用法是指针学习必不可少的一部分。



