程序设计 •Program Design
【关键词】C语言 指针 间接访问
1 何为指针及基本语法
按照冯•诺伊曼计算机工作原理,程序在运行之前,首先要把程序装入内存中存储起来。接下来才是从内存取指令、分析指令、执行指令。执行指令的过程中还要从内存读取数据及把数据存入内存单元中。所以程序运行的每一条语句,都和内存打交道,不是从内存单元读取数据就是把计算结果写入内存单元中。
按照内存的组织结构,它是由一系列的存储单元组成。一个基本存储单元就是8个二进制位组成的字节。每个存储单元,即每个字节单元由一个地址编号,用来标识该存储单元。如图1所示。
指针及基本语法:
指针就是内存单元的地址编号。程序中定义的所有变量、数组、函数等有名字的对象,编译器都会给它们分配相应的内存单元。例如下面的程序段。
int a,*p;
p=&a; //取a变量的地址,并赋值给指针变量p
*p=12; //*是间接访问运算符,*p等价于a
// & , * 两个运算符是互逆的运算。前面的运算是获取变量地址的运算符,
// 后面的运算是间接运算符,也叫取值运算符,或指向运算符。
假设,a的内存单元分别是2000,2001,2002,2003共4个字节单元。所以a的首地址是2000。同样,假设,p的内存单元是5000,5001,5002,5003共4个字节单元。所以p的首地址就是5000。见图2所示。
该段程序是定义一个整型变量,名字是a,同时也定义一个p变量,因为p的前面有符号*,所以p的类型是指针型。此处的*是标识符号,标志p是指针变量。就是p的内存单元存储了另一个整型变量的地址。这里,p的单元中存储了变量a的地址,所以说p变量指向了变量a。第三行代码p的前面也有一个*,此处的*是运算符号,运算对象是p,*p指p C语言指针基本语法及用法
文/刘变莲
指向的对象,此处就是a,也就是*p就是a。借指针变量来读写a的数据,这种方法称为间接访问a的方法。用a的名字来访问a内存数据的方法称为直接访问a的方法。
所以,变量名a即指内存单元,也指内存单元中的数据。变量名就是内存单元的代号,所以,知道变量名,也可以获得内存单元的地址;反之,知道地址,也可以获得内存单元中的值。所以,*和&是互逆的一对运算符号。
总之,指针变量存储了另一个变量的地址。可以通过指针变量间接访问它指向的变量。
2 在何处用指针
2.1 在函数之间共享数据
如果某个函数想使用另一个函数中定义的数据,因为受变量作用域的限制,需要指针
类型的参数,作为传递数据的通道。下面的程序是实现主函数中变量a和变量b交换数值,程序如下。
void swap( int* , int*);
int main(){
int a,b;
scanf(“%d%d”,&a,&b):
swap(&a,&b);
printf(“a=%d,b=%d\n”, a,b);
return 0;
}
void swap(int *x,int *y){
int t;
t=*x; *x=*y; *y=t;
}
分析上面的例子,swap函数调用时,主函数中,a,b变量的地址用实参数的形式传递给形参变量x,y,所以,swap函数内,*x,*y分别代表主函数的变量a,b。所以就可以实现主函数中的数据a,b,swap函数中也可以使用,用的是间接使用。*x,*y就是间接使用了主函数中的变量a,b。
2.2 高效访问数组元素
指针可以用来高效访问数组元素,下面的程序段就是例证。
int i,a[10],*p=a;
for(i=0;i<10;i++,p++)
c语言指针实验总结scanf(“%d”,p);
for(p=a;p<a+10;p++)
printf(“%4d”,*p);
分析上面的程序,之所以可以用指针变量快速访问数组元素,就是因为数组元素是连续存储,并且指
针变量可以完成自增1的运算,就是这里的p++,p变量中存储了从下标是0的元素的地址到下标是9的元素的地址。3 使用指针应注意的事项
指针变量在使用前,必须要指向一个已经存在的对象,否则就会带来风险操作,见下面的程序片段。
int *p;
scanf(“%d”,p); //是危险的操作
假如有下面的语句存在的情况下,才能做上面的操作。
p=&a;
4 指针总结
指针就是内存单元的地址编号,也就是地址的另一个称谓。指针变量就是存储其他对象地址的变量。我们是要利用指针去访问另一个它指向的对象,比如,变量、数组元素、函数,甚至是指针等。由于篇幅,留待以后进一步阐述指针。
参考文献
[1]IvorHorton. C语言入门经典:第4版[M].
清华大学出版社,2009.
[2]StephenPrata,普拉塔,云巅工作室.C
Primer Plus (第五版) 中文版:C Primer Plus中文版[M].人民邮电出版
社,2005.
[3]里科,徐波.C和指针:Pointers on
c[M].
人民邮电出版社,2008.
作者简介
刘变莲,女,山西省静乐县人。硕士学位。副教授。现任职于中北大学大数据学院。研究方向为计算机图形图像处理。
作者单位
中北大学 山西省太原市 030051
图1:内存结构
图2:指针变量p 指向整型变量a
236 •电子技术与软件工程 Electronic Technology & Software Engineering
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论