摘要:指针是c语言中的重要概念通过准确掌握指针的概念和指针的使用可以设计复杂的数据结构和高效的程序这里重点论述了指针的概念及其在程序中的应用。
关键词:指针; 存储器单元; 存储器单元地址; 直接访问; 间接访问
图中分类编号:TP312文献识别代码:A文章编号:1009-3044(2009 ) 31-0000-00
完全可编程语言pointervariable
沥北
(Finance and Economics College,University of Qinghai,Xining 810016,China )
abstract 3360 clanguagepointerisanimportantconcept、 thecorrectproficiencyintheconceptofpointersandpointerusewillbeabletodesigncomplexdatastructuresandeficientprocedures.this intis
key words :点; 存储器单元; 内存小区地址; 直接访问; 直接访问
指针是c语言的重要特色之一。 C语言的强大和自由性,目前大多用于其灵活的指针运用。 通过正确运用指针,可以有效地表示复杂的数据结构; 方便地使用可以动态分配内存的字符串; 在调用使数组更易于有效使用的函数时会生成一个或多个结果。 在系统软件的设计中,能够直接处理存储器单元地址等是非常必要的。 因此,我说指针是c语言的灵魂。
1内存分配
计算机的内存都被寻址了,好像是家里的地址。 在编译或运行程序时,每当遇到包含函数输入参数声明的声明语句时,编译系统都会为预定义变量分配相应的存储单元。 也就是说,每个变量在存储器上有固定的位置,根据变量的数据类型不同,存储器单元的数量也不同。 如果在程序中将:定义为
int a=1,b=2;
float x=3.4,y=4. 5;
double m=3.124;
char ch1='a ',ch2='b ';
如果将变量的地址保存在存储器的特定区域,并用变量存储这些地址,则这种变量为指针变量,通过指针访问指向变量是对变量的“间接访问”。
设:
int*pa,*pb; float*px,*py;
double*pm; char*pch1,*pch2;
pa=a; pb=b; px=x; py=y; pm=m; pch1=ch1; pch2=ch2;
当前,访问变量a、b、x、y、m、ch1、ch2对应的存储单元时,不仅可以通过变量名访问,还可以通过指向这些变量的指针进行访问。
两者的关系如图2所示。
此时,访问与a变量对应的存储器空间有: a、*pa两种方式。
2指针是整数
指针。 在无符号整数(unsigned int )中,将当前系统地址范围设为可取值范围的整数。 32位系统的寻址能力(地址空间)在4g-byte(0~2^32-1 )二进制表示长度为32位(即4B ) int类型中也正好如此取值。
例如:程序1
#包含
main () )
{char *pt;
char t='h ';
pt=t;
putchar(*pt; }
程序2
#包含
main () )
{char *pt;
char t='h ';
pt=(char* ) 1245048; /*1245048为pt的值*/
putchar(*pt; }
程序1得到的答案与程序2的答案一致。 (根据机器的不同,可能需要调整pt的取法。 )
根据3 C的值进行传达
对c的函数调用按值传递,传递的参数只是等于子函数中初始值的副本,不能对传递的参数进行更改。 但是,在实际编程中,经常更改传递的参数的值。 这可以使用输入参数的地址,而不是原始参数本身。 输入参数(到地址) )运算,可以在内存中直接修改,更改想用作输入参数的参数值。
#包含
这是语音输入(int * val )
{(*val; }
main () )
{int a=3;
Inc(a );
printf('%d ',a ); }
调用函数语句inc(a )执行时,a的地址被传递给函数Inc的自变量) val )在函数内部执行
了(*val)++;就等于改变了变量a的值。执行完inc函数后返回到main函数输出a的值为4,操作*val,即是在操作a 了。4 双重指针(指向指针的指针)
设有如下程序:
#include
void main()
{ int a=3;int *p; int **p1;//p1是一个指向指针的指针(双重指针)
p=&a;
printf("%d,%dn",p,*p);
p1=&p; //指向了一级指针p
printf("%d,%dn" *p1,**p1);
}
运行结果:1245052,3
1245052,3
若有:int a,*p1=&a,**p2=&p1; 则下面引用都是正确的。
*p1 //代表变量a
*p2 //代表表指针变量p1
**p2//代表变量a
5 指针数组、数组指针和指向函数的指针
指针数组是一组有序的指针集合,它所有元素都必须是具有相同存储类型和指向相同数据类型的指针变量。
设有:int a,b,c;int *p[3]={&a,&b,&c};
上述语句定义了一个名称为p的指针数组,其中有三个元素p[0]、p[1]、p[2]分别指向三个整型变量a、b、c。此时可以通过*p[0]、*p[1]、*p[2]这三种方式来访问a、b、c。
数组指针是指向数组的指针。数组在计算机内存中占据一片连续的存储空间。数组名存放着这一连续空间的首地址(注意这是一个常数)。数组指针指向这一片连续空间的起始地址。
设有:
int a[10]{1,2,3,4,5,6,7,8,9,10},*p=a; /*p指向了起始地址*/
此时访问数组a中第三个元素有三种方法:a[2]、*(a+2)、*(p+2)
设有:
int b[3][3]={{1,2,3},{4,5,6},{7,8,9}},*p=&[0][0]; /*此时p这是一个列指针*/
此时访问数组b中第一行的第2个元素有:a[0][1] 、*(p+1)、*(*a+1)(注:a是一个行指针)三种方法。
指向函数的指针,从二进制角度考虑,数组名是该数组数据段首地址,函数名就是该代码段的首地址。
设有如下程序:
#include
void inc(int *val)
{(*val)++;}
main()
{void (*fun)(int *);//定义了一个指向函数的指针(下转第8716页)
(上接第8713页)
int a=3;
fun=inc; //这个函数指针指向了函数的入口地址
(*fun)(&a);//此时该语句与inc(&a); 等价
printf("%d" , a);}
程序运行的结果与上面第4个问题完全相同。丰富了访问函数的方法。
6 结束语
指针可以指向任何类型的变量用,有效地表示出复杂的数据结构;指针可以指向函数;用于函数参数传递,达到更加灵活使用函数的目的,有了指针在编程时丰富了访问内存单元的手段和方法,使C语言程序的设计更加灵活、实用、高效。
参考文献:
[1] skdqc.C语言核心开发技术从入门到精通[M].北京:电子工业出版社,2009.
[2] jsdws.C语言程序设计[M].北京:中国铁道出版社,2008.
[3] 长情的板栗.C语言复习指南与题解[M].北京:清华大学出版社,2003.
[4] yydcg.C程序设计[M].北京:清华大学出版社,2005.