C指针详解三

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");
}

结果如下:
在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章