C语言中指针应用的常见问题

时间:2022-09-08 08:04:58

C语言中指针应用的常见问题

摘 要: 指针的应用在C语言中既是重点又是难点,本文作者对指针使用中出现的常见问题作了简要的归纳、分析、总结,希望能对C语言初学者起到一定的帮助作用。

关键词: C语言 指针 应用 常见问题

指针是C语言中的一个重要概念,指针的应用也是C语言中最重要的一个内容。具有指针类型的变量(即指针变量)可以存放其他变量的地址,能有效地表示数据之间复杂的逻辑关系。正确而灵活地运用指针可以给程序设计带来许多方便,比如可以有效地表示复杂的数据结构、动态分配内存、方便地使用字符串,在调用函数时能够得到多于一个的和可以直接处理内存地址等。

能否正确理解和使用指针是我们是否掌握C语言的一个标志。但是由于指针太过灵活,一旦使用不当,不仅错误难查,而且会出现意想不到的错误。因此,要编出正确而高效的程序,必须正确地理解和使用指针。本文着重分析了指针应用中的若干常见问题,以帮助初学者更好地掌握指针。

一、指针变量在初始化时应注意的问题

1.“*”在使用时有不同的含义:在声明变量时用在变量的前面,其作用是说明该变量为指针变量,其它情况用在指针变量前面作为指针运算符。

如:int *P,i=5;(*用在P前面,说明P为指针变量)

P=&i;

printf(“%d\n”,*P);(*用在P前面。作为指针运算符)

又如:int *p=null;等价于int *p;p=null;两条语句的组合。

2.不能给未初始化的指针赋值。

main( )

{int i,*P;

i=5;

*P=8;

return 0;

}

指针在未初始化的时候,它的指向是不确定的,因此对它的运算是不正确的。也有可能会带来“灾难性”的后果,在使用指针前要使它有个确切的指向,在语句i=5和*P=8之间加一条语句P=&i即可,这样就让指针变量P有了明确的指向。

二、指针变量在赋值时应注意的问题

1.给指针变量赋值必须是地址值[1],不能赋予任何其它数据。C语言中提供了地址运算符“&”来表示变量的地址。其一般形式为:&变量名;如&a表示变量名a的地址。

例如:int b;int *p;p=&b;此为正确的赋值方法。但有时会有如下错误书写:int *p;p=156;这样就使指针p指向了地址156(十进制),编译时系统会提示出错。

2.不同类型的指针不能相互赋值

指针是具有具体类型的,在给指针赋值时,不但要求是地址,而且应该是一个与该指针类型相符的变量或者常量的地址。

例如:“int *p;float a=3.4,*q=&a;p=q;”以上语句中在“p=q;”这条语句上存在错误,因为p是一个整型指针,只能存放int型数据的地址,而q指向的是一个实数型变量,里面存放的是float型数据。二者不相匹配,因此在编译时会发生错误。

三、指针变量用于数组时应注意的问题

1.数组名与指针变量的区别。指针常用于数组中,数组名代表数组的起始地址[2]。可将数组名赋给一个指针变量,即该指针变量指向了该数组,从而使得访问数组可以采用地址法(访问数组元素还可用下标法)。指向数组的指针变量可以作加减法的运算,且只有指向同一数组,两个指针变量可作减法(结果为相隔的元素个数)及关系运算。

如:int a[5]={1,2,3,4,5),*p;若有这样的语句:for(p=a;p

2.使用指针法访问数组元素时,要注意“下标是否越界”的问题。p+5表示a+4下面的一个整型单元。这样会破坏有用的数据,产生不应有的后果,严重地造成死机,c编译系统并不指出“下标越界”这样的错误。

3.使用指向数组元素的指针变量时,应注意指针变量的当前值。如p=a;for(i=0;i

4.两个指针相加产生错误。两个指针是不能相加的。如果你的C程序试图将两个指针相加,译程序就会发出警告。当你试图将一个指针和另外两个指针的差值相加的时候,你很可能会误将其中的两个指针相加。例如,你很可能会使用语句:p=p+p2-p1。这个语句是不正确的,因为它和语句p=(p1+p2)-pl完全相同,正确语句应该是:p=p+(p2-p1)。

四、指针变量用于函数时应注意的问题

函数的返回值不仅可以是一般的数据类型,还可以为指针类型,这种带回的类型为指针的函数称为指针函数[3]。对于函数带回的指针,这个指针所指示的存储单元必须是存在的,不可以不存在。例如:

int *max(int x,int y)

{int *p;

if(x>y)p=&x;

else p=&y;

return p;

}

main( )

{int a,b,*m;

scanf(“%d%d”,&a,&b);

m=max(a,b);

printf(“MAX=%d\n”,*m);

}

max是指针函数。编写该函数的本意是由指针P带回x、y中较大数的地址,但函数max执行完毕,返回主函数main时x、y所占用的存储单元已被释放,而P带回的将是一个不存在的存储单元,这样做显然是不正确的。因此,程序应该改为:

int *max(int *x,int *y)

{int *p;

if(*x>*y)p=x;

else p=y;

return p;

}

main( )

{int a,b,*m;

scanf(“%d%d”,&a,&b);

m=max(&a,&b);

printf(“MAX=%d\n”,*m);

}

这样修改后,max函数中的指针P带回的则是主函数main中a,b两者中较大数的地址,就可以正确输出了。可见指针函数中带回的指针应该是主调函数中变量的地址,不能是已释放空间的地址。

熟练掌握指针可以编写灵活的程序,但是误用指针可能会造成严重的破坏,要透彻地理解,谨慎地使用指针,我们还需要在上机实践中不断地摸索、总结。

参考文献:

[1]王声决,罗坚.C语言程序设计[M].北京:中国铁道出版社,2002.

[2]谭浩强,周海燕,冯玉山,崔武子等.C语言程序设计[M].北京:华夏出版社,2005.6.

[3]谭浩强.C语言程序设计[M].北京:清华大学出版社,2002.

本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

上一篇:计算机犯罪的成因及防范措施 下一篇:单片机应用实训室建设研究