C语言指针中的几个常见错误及纠正方法

摘要:C语言中指针是它的精髓部分,也是它的重要特色。正确灵活地运用指针可以有效地表示复杂的数据结构;能够方便地使用字符串;能动态分配内存;能直接处理内存地址;有效而方便地使用数组等。掌握指针的应用,可以使程序简洁、紧凑、高效。每个学习和使用C语言的人,都应当深入地学习和掌握指针。 
  关键词:C语言;指针;数组 
  C语言指针的应用非常灵活,使用它也存在者危险。对熟练的人来说,正确的使用它可编写出颇具特色且质量优秀的程序,实现用其它高级语言难以实现的功能。但如果使用不当,很容易出错。有些隐藏较深的错误很难发现和排除,因此在学习C语言时,理解和使用指针非常重要。以下通过几个实例,说明指针编程时的几个常见错误和改正办法。 
  一、 使用未初始化的指针 
  C语言中指针是用于存放变量地址的。指针变量是C语言中的一个特殊类型的变量。指针变量定义后应确定其指向。在没有确定指针的具体指向前,指针变量的内容是随机的地址,盲目地引用将十分危险。 
  例如:下列程序用于将键入的两个整数按大小顺序输出。 
  swap(p1,p2) 
  int*p1,*p2; 
  {int*p; *p=*p1; *p1=*p2; *p2=*p; 
  } 
  main() 
  { 
  int a,b; 
  int *pointer1,*pointer2; 
  scanf(“%d,%d”,&a,&b); 
  pointer=&a;pointer2=&b; 
  if(a 
  printf(0%d,%d0,a,b); 
  } 
  这里swap函数的功能是实现指针p1,p2所指单元内容互换,其中以*p为中间变量,这就犯了未定向就使用的错误,根据C编译系统的规则,当swap函数发生调用时,系统仅给指针p分配一个内存单元。而这一内存里存放的地址未定。它可能是操作系统或其它用户区的某一内存地址,当运行程序时,很可能使不属于本程序的某个内存内容被修改,从而造成整个系统的崩溃。对swap函数可修改为如下形式: 
  swap(p1,p2) 
  int*p1,*p2; 
  {intp; p=*p1; *p1=*p2; *p=p; } 
  二、指针变量所指向的变量类型与其定义的类型不符 
  定义指针变量的一般格式为: 
  类型说明符 *指针变量名; 
  其中类型说明符规定的是指针变量所指向的变量的类型。C语言规定一个指针变量只能指向同一类型的变量。例如: 
  main() 
  { 
  float x; 
  int *p; 
  p=&x; 
  } 
  x与*p数据类型不符。因x的类型是单精度实型的,而指针p是指向整型变量的指针,应将语句改为: float *p; 
  又如: 
  main() 
  { 
  int *p; 
  p=malloc(sizeof(mt)); 
  } 
  malloc()函数的功能是分配内存存储空间,并返回一个指向分配空间起始单元的指针。一般系统中,此指针为char型或void型,因此与指针变量p类型不符。应对malloc函数做强制转换,改为: p=(int)malloc(sizecf(int)); 
  三、指针的错误赋值 
  指针变量的值是某个数据对象的地址,只允许取正的整数值,而千万不能将它与整数类型变量混淆。指针赋值时在赋值号右边的应是变量地址,且是所指变量地址。 
  例如: 
  main() { 
  int i=5; 
  int *p; 
  p=i; } 
  语句p=i中的赋值是错误的,应改为: 
  p=&i; 
  又如: 
  main() { 
  int max(); 
  int *pointer(); 
  pointer=max(); } 
  语句的含义是将int型函数值赋给了指针变量,是错误的写法,应直接写函数名就行了,即:p=max; 
  四、结束语 
  指针是C语言中极重要的概念,是其特征功能之一,也是C语言程序设计的难点。本文只对一部分常见问题给出正确使用指针的方法。

  • 7
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值