【C语言】指针的基本概念

        指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,能够表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等,这对设计系统软件是非常必要的。

        如果在程序中定义了一个变量,在对程序进行编译时,系统会为这个变量分配内存单元。编译系统根据程序中定义的变量的数据类型,分配一定的长度空间。假设有一个输出语句printf("%d",i),程序是这样执行的:根据变量名与变量地址的关系(这个关系是在编译的时候确定的),找到变量i的地址,从i地址开始后的两个字节中读取数据(也就是i),把它输出。

       一个变量的地址称为该变量的指针。如果有一个变量专门用来存放其他变量的地址,那么这个变量成为指针变量。指针变量的值是地址。指针是一个地址,而指针变量是存放地址的变量

        在定义指针变量时要注意两点:

        (1)指针变量前面的*表示该变量的类型为指针变量;

        (2)在定义指针变量时必须指定基类型。

        只有整形变量的地址才能存放到指向整形变量的指针变量中。下面看一个例子

#include<stdio.h>
int main(void)
{
	int a, b;
	int * pointer_1, * pointer_2;
	a = 100;
	b = 10;
	pointer_1 = &a;
	pointer_2 = &b;
	printf("%d,%d\n",a,b);
	printf("%d,%d\n",*pointer_1,*pointer_2);

	return 0;
}


        对程序的说明:

       (1)在开头定义了两个指针变量pointer_1和pointer_2,但是并没有令它们指向任何一个整型变量。只是提供了两个指针变量,规定它们只能指向整型变量。至于指向哪一个整型变量,需要在程序中指定。

       (2)最后的*pointer_1和*pointer_2就是变量a和b。

        例子 输入a和b两个整数,按照先大后小的顺序输出a和b

#include<stdio.h>
int main(void)
{
	int a,b;
	int * p ,* q;
	p = &a;
	q = &b;
	printf("input two data:");
	scanf("%d%d", &a, &b);
	if(a<b)
	{
		p = &b;
		q = &a;
	}
	printf("a=%d,b=%d\n",a,b);
	printf("Max=%d,Min=%d\n", *p, *q);
}


        a和b本身的值没有变,它们仍然保持原值,但是p和q的值变了,它们指向的变量变了。

        函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。

#include<stdio.h>
int main(void)
{
	int a, b;
	void swap(int * p1, int * p2);
	int * pointer_1, * pointer_2;
	pointer_1 = &a;
	pointer_2 = &b;
	printf("input two data:");
	scanf("%d%d",&a, &b);
	if(a < b)
	{
		swap(pointer_1, pointer_2);
	}
	printf("a=%d,b=%d\n",a, b);
	printf("Max=%d,Min=%d\n",*pointer_1, *pointer_2);

	return 0;
}

void swap(int * p1, int * p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}


        如果想通过函数调用得到n个要改变的值,可以:

  1. 在主调函数中设置n个变量,用n个指针变量指向它们;
  2. 然后将变量指针作为实参,将这n个变量的地址传给所有调用的函数的形参;
  3. 通过形参指针变量,改变这n个变量的值;
  4. 主调函数中就可以使用这些改变了值的变量。

        例子 输入a,b,c三个整数,按照大小顺序输出

#include<stdio.h>
int main(void)
{
	int a, b, c;
	int * pointer_1, * pointer_2, * pointer_3;
	void exchange(int *, int *, int *);	
	pointer_1 = &a;
	pointer_2 = &b;
	pointer_3 = &c;
	printf("input three data:");
	scanf("%d%d%d",&a, &b, &c);
	exchange(pointer_1, pointer_2, pointer_3);
	printf("%d %d %d\n",a, b, c);

	return 0;
}

void exchange(int * p1, int * p2, int * p3)
{
	void swap(int *, int *);
	if(*p1 < *p2)
	{
		swap(p1, p2);
	}
	if(*p1 < *p3)
	{
		swap(p1, p3);
	}
	if(*p2 < *p3)
	{
		swap(p2, p3);
	}

}

void swap(int * p1, int * p2)
{
	int temp;
	temp = *p1;
	*p1 = *p2;
	*p2 = temp;
}


 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值