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

来源:互联网 发布:贵州广电网络维修电话 编辑:程序博客网 时间:2024/05/22 03:44

        指针是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;}


 

原创粉丝点击