文章目录
1、指向指针的指针
指针变量可以指向整型变量、实型变量、字符类型数据,也可以指向指针类型变量。称之为指向指针的指针变量
定义如下:
类型标识符 **指针变量名;
例如:
int **p;
其含义为定义一个指针变量p,它指向另一个指针变量,该指针变量又指向有个基本整型变量。由于基本指针运算符*是自右向左结合的,所以上述的定义和下面一样
int *(*p);
整型变量i的地址是&i,将其值传递给指针变量p1,则p1指向i;同时,将p1的地址&p1传递给p2,则p2指向p1。p2就是指向指针变量的指针。下图表现更形象。
例子如下:
#include<stdio.h>
int main()
{
int i;
char **p;
char *number[]=
{
"one",
"two",
"three",
"four"
};
for(i=0;i<4;i++)
{
p=number+i;
printf("%s\n",*p);
}
}
2、指针变量作函数参数
指针变量也可以作为函数的参数,例如下例,利用指针函数做交换函数的参数
在本例中自定有swap交换函数,在主函数中调用交换函数,交换函数的两个形参被传输两个地址值,也就是传入了两个指针变量,在交换函数内部使用整型变量temp作中间变量。将两个指针所指向的数值进行交换。
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b)
{
int temp;
temp = *a;
*a = *b;
*b = temp;
}
int main()
{
int x, y;
printf("please input two numbers:\n");
scanf("%d", &x);
scanf("%d", &y);
swap(&x, &y);
printf("x=%d\n", x);
printf("y=%d\n", y);
system("pause");
}
结果如图
如果将函数更改成如下函数,结果就会如下面图片所示,并没有交换数值,这里涉及到了函数传值。
在函数调用过程中,主函数与调用函数之间存在一个数值传递的过程,函数调用中发生的数值传递是单向的,就是只能把实参传递给形参,在函数调用的过程中,形参的值发生改变,但是实参的值是不会发生改变的,因此下面这段代码并不会实现数值交换。
通过指针传递参数可以减少传递带来的开销,也可以使函数调用不产生值传递。
#include<stdio.h>
#include<stdlib.h>
void swap(int a,int b)
{
int temp;
temp = a;
a = b;
b = temp;
}
int main()
{
int x, y;
printf("please input two numbers:\n");
scanf("%d", &x);
scanf("%d", &y);
swap(x, y);
printf("x=%d\n", x);
printf("y=%d\n", y);
system("pause");
}
结果如下: