如果你发现特殊情况太多,那你肯定是用错方法了。 —— Carig Zerouni
👩指向指针的指针
一个指针变量可以指向整型变量、实型变量、字符类型变量,当然也可以指向指针类型变量。当这种指针变量用于指向指针类型变量时,则称之为指向指针的指针变量,一般定义如下:
类型标识符 **指针变量名
例如:
int **p;
其含义就是定义一个指针变量p,它指向另一个指针变量,该指针变量又指向一个基本整型变量。这里要提一句,指针运算符“ * ”是自右至左结合的,所以上述定义相当于:
int *(*p);
我们这里来看一个例题,用指向指针的指针变量输出12个月:
#include <stdio.h>
int main()
{
int i = 0;
char** p;
char* month[] =
{
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December"
};
for (i = 0; i < 12; i++)
{
p = month + i;
printf("%s\n", *p);
}
return 0;
}
运行结果:
👨指针变量作为函数参数
通过前面的介绍,我们知道整型变量、实型变量、字符串变量、数组名等都可以作为函数参数。除此之外,指针型变量也可以作为函数参数。
我们下面来看一个交换两个变量值的例子:
#include <stdio.h>
void Swap(int *a, int *b)
{
int tmp;
tmp = *a;
*a = *b;
*b = tmp;
}
int main()
{
int x = 0;
int y = 0;
printf("请输入两个数字: \n");
scanf("%d %d", &x, &y);
int* p1 = &x;
int* p2 = &y;
Swap(p1, p2);
printf("x = %d y = %d", x, y);
return 0;
}
运行结果:
在上述代码中,Swap是我们自定义的函数,再main函数中调用该函数交换变量a和b的值,Swap函数的两个形参传入了两个地址值,即传入了两个指针变量。我们在Swap内部引入了中间变量tmp,将两个指针变量所指向的数值进行转换。这就是指针变量作为函数参数的使用方法。
🧑返回指针值的函数
指针变量也可以指向一个函数。函数在编译时会被分配一个入口地址,也就是函数的指针。我们可以用一个指针变量指向函数,然后通过该指针变量调用此函数。
一个函数可以带回一个整型值,字符值等等,也可以带回指针型的数据,也就是地址。返回指针值的函数简称为指针函数,定义指针函数一般形式如下:
类型名 *函数名(参数表列);
例如:
int *Mvp(int x, int y)
其中Mvp是函数名,调用它以后可以得到一个指向整型数据的指针。x和y就hi函数的形式参数了,均为基本整型。函数的函数名前有一个“ * ”,说明此函数是指针型函数。
👧指针数组作main函数的参数
我们在前面的程序几乎都会出现main函数。main函数被我们称为主函数,是运行所有程序的入口。main函数是由系统调用的,当处于操作命令状态下,输入main所在的文件名,系统即调用main函数,在前面的内容中,对main函数始终作为主调函数进行处理,也就是允许main调用其他函数并传递参数。
我们来看看main函数带参的形式:
main(int a, char* arr[])
从函数参数的形式上来看,包含一个整型和一个指针数组。
👦总结
指针这一部分我们介绍了指针的相关概念及其用法。我们首先要理解变量与指针之间的区别,重点掌握指点变量的相关概念及其用法。其中使用指针变量作为函数参数在编写程序过程中用的比较多,希望大家能够多多注意。