【C语言】指针的基本概念
2013-11-14 20:13
357 查看
指针是C语言中的一个重要概念,也是C语言的一个重要特色。正确而灵活地运用它,能够表示复杂的数据结构;能动态分配内存;方便地使用字符串;有效而方便地使用数组;在调用函数时能获得一个以上的结果;能直接处理内存单元地址等,这对设计系统软件是非常必要的。
如果在程序中定义了一个变量,在对程序进行编译时,系统会为这个变量分配内存单元。编译系统根据程序中定义的变量的数据类型,分配一定的长度空间。假设有一个输出语句printf("%d",i),程序是这样执行的:根据变量名与变量地址的关系(这个关系是在编译的时候确定的),找到变量i的地址,从i地址开始后的两个字节中读取数据(也就是i),把它输出。
一个变量的地址称为该变量的指针。如果有一个变量专门用来存放其他变量的地址,那么这个变量成为指针变量。指针变量的值是地址。指针是一个地址,而指针变量是存放地址的变量。
在定义指针变量时要注意两点:
(1)指针变量前面的*表示该变量的类型为指针变量;
(2)在定义指针变量时必须指定基类型。
只有整形变量的地址才能存放到指向整形变量的指针变量中。下面看一个例子
对程序的说明:
(1)在开头定义了两个指针变量pointer_1和pointer_2,但是并没有令它们指向任何一个整型变量。只是提供了两个指针变量,规定它们只能指向整型变量。至于指向哪一个整型变量,需要在程序中指定。
(2)最后的*pointer_1和*pointer_2就是变量a和b。
例子 输入a和b两个整数,按照先大后小的顺序输出a和b。
a和b本身的值没有变,它们仍然保持原值,但是p和q的值变了,它们指向的变量变了。
函数的参数不仅可以是整型、浮点型、字符型等数据,还可以是指针类型。它的作用是将一个变量的地址传送到另一个函数中。
如果想通过函数调用得到n个要改变的值,可以:
在主调函数中设置n个变量,用n个指针变量指向它们;
然后将变量指针作为实参,将这n个变量的地址传给所有调用的函数的形参;
通过形参指针变量,改变这n个变量的值;
主调函数中就可以使用这些改变了值的变量。
例子 输入a,b,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; }
相关文章推荐
- 第08天C语言(09):指针-基本概念
- C语言基本概念笔记《三》之指针,数组,动态数组的创建
- C语言指针、typedef等基本概念的使用
- 第09天C语言(07):指向函数的指针-基本概念
- C语言指针的基本概念
- c语言—指针基础(1:指针的基本概念)
- c语言中的指针基本概念
- C语言基本概念之空指针
- C语言基本概念笔记《五》之指针与链表
- C语言指针系列1——指针基本概念
- C_C语言的指针的概念与使用
- C/C++基础知识:函数指针和指针函数的基本概念
- C语言基本概念
- C语言基本概念之表达式
- 程序设计基石与实践之C语言基本概念
- c语言基本类型和指针
- 指针的基本概念
- C语言的指针的基本语法
- 1分钟彻底理解C语言指针的概念
- C语言基本概念之序列点