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