您的位置:首页 > 编程语言 > C语言/C++

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

2013-11-14 20:13 357 查看
        指针是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个要改变的值,可以:

在主调函数中设置n个变量,用n个指针变量指向它们;
然后将变量指针作为实参,将这n个变量的地址传给所有调用的函数的形参;
通过形参指针变量,改变这n个变量的值;
主调函数中就可以使用这些改变了值的变量。
        例子 输入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;
}


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  指针