C语言程序设计中的指针操作
发布时间:2021-01-21T02:34:36.398Z 来源:《当代教育家》2020年35期作者:王隆贵
[导读] 当然,C 语言程序设计指针难以理解、易出错,只有在实践中不断总结学习经验,才能更好的应用 C 语言指针,才能设计出高质量的程序。
武汉东湖学院湖北省武汉市 430000
摘要:指针是 C 语言程序设计中一种重要的数据类型,其在 C 语言程序设计中具有十分重要的作用和地位,通过指针的使用,可以很容易的处理复杂的数据结构,设计出高效率的程序。当然,C 语言程序设计指针难以理解、易出错,只有在实践中不断总结学习经验,才能更好的应用 C 语言指针,才能设计出高质量的程序。
关键词:c 语言;指针;操作分析
一、指针的定义
指针是 C 语言程序设计中一个重要的概念,指针是一种与普通变量不同的特殊的变量,普通变量主要用来存储程序运算时需要处理的数据或值,而指针则是内存单元地址。在程序设计过程中我们对指针的内
存单元地址不感兴趣,感兴趣的是这个内存单元地址所存储的变量或函数,即指针所指向的变量或函数。这个过程如同客户点菜时,吸引客户的不是菜单,而是菜单所“指向”的菜。要注意的是指针和指针变量之间的差别,所谓指针就是存储单元地址号,指针变量则是一个能够存储地址值的变量,它可以通过存储指针变量的地址值间接地访问指针变量所指向的变量值。
二、指针的操作与问题分析
C 程序中指针可以指向数据类型中的所有类型,如普通、结构、函数等,指针甚至可以实现指向指针,指针的操作使用与其所指向的数据类型有关。例如指向数值型的指针能够进行加减乘除相关数学运算,指向字符串型指针可以完成字符串的输入、输出,指向结构体的指针可以访问结构体内字段数据,指向函数的指针是函数调用的接口。在指针的操作使用过程中要注意以下几点:
(一)定义指针时需要做初始化,如果指针指向的数据还没有明确,可以初始化为 0 或 NULL。如果只定义指针而不做初始化容易破坏系统数据和引起系统故障。例如:int *p;*p=10;
p 是一个指针变量,在没有明确地址指向的时候即附值 10,当把 10 附值给 p 时,就可能会覆盖原来的信息,甚至破坏系统。因此,在给指针附值时需要做地址指向初始化,正确的代码为:
I n t b,* p;p = & b;* p = 1 0;或者改为 i n t * p;p =(i n t *)malloc(sizeof(int));*p=10;
(二)字符指针使用错误
数学数组的定义是什么C 语言中不可以定义字符串变量,字符串的处理与应用可以借助字符数组或字符指针来完成。字符数组或字符指针在处理字符串时有区别:应用字符数组处理字符串时,系统为字符串数据分配固定连续的存储空间,数据名即该存储空间的首地址;使用字符指针管理字符串时,系统不会为字符指针分配存储空间,而仅是系统中一个随机的地址值。如:
Char *s1,s2[60];scanf(“%s”,s1);s2=”abcdefghijk”;
输入语句 scanf(“%s”,s1)虽然格式正确,但可能会导致 s1 中的信息丢失;s2=”abcdefghijk”附值语句中 s2 是数组名,是一个指针常量,代表数组的首地址,其值不能改变,直接附值错误。因而,正确的代码应为:Char *s1,s2[20];s1=(char *)malloc(60);scanf (“%s”,s1);strcpy(s2,”abcdef gh”);或者改为:char s1[60],*s2;scanf(“%s”,s1);s2=”abcdefgh”;
在处理字符串时字符指针能够直接指向字符串常量的首地址,但字符数组则不行。
(三)当指针指向数组类型数据时,指针能够替换数组名使用。如下代码:
int b[3]={1,2,3};int *p=b 则 p[0]、p[1]、p[2] 与 b[0]、b[1]、b[2] 对应值相同。
(四)指针能够实现受限制的加减运算
C 语言指针完成自加或自减时与普通数值型变量有区别,在进行自加或自减运算时必须保证指针进行加减运算后结果仍有意义。当 C 语言指针指向数组后,指针的加减运算变得有意义,进行自加运算时指针指向数组中的下一元素;进行自减运算时指针指向数组中的上一元素。如果指向相同数组的两指针进行相减,即地址大的减地址小的,结果则是两个指针间数组元素的个数。
批量处理相同的数据可以运用数组来实现,定义数组后数组中的每个元素均可以作为单独的指针常量来使用。
(五)形参指针调用缺少地址,如下程序:
void s(x,y)int *x,*y;{int t;t=*x;*x=*y;*y=t}
main(){int a=1,b=2;printf(“before swaping a and b:a=%d,b=%d”,a,b);s(a,b);printf(“after swaping a and b:a=%d,b=%d”,a,b);}
上述代码能正常编译和执行,但运行结果没有实现交换 a 与 b 的值,这是因为形参为指针,实参调用时必须为对应的地址。可以将调用函数改为:s(int *x,int *y),系统编译时若主调函数没有按要求传送地址则报错,上述修改可以避免调用时未传送地址值错误。
(六)一维二维数组名的正确使用
C 语言中一维和二维数组名均表示数组元素的首地址。但二者有区别一维数组表示的是所有元素中第一个元素的首地址,二维数组表示的是第 0 行的首地址,在程序设计时要注意区别,如下程序:
Main(){inta[2][3]=1,2,3,4,5,6,*p;for(p=a;p<a+6;p++){printf(“%d”,*p);if((p-a)%3==0)printf(“\n”);}}程序能通过编译和执行,但结果不对,问题出现在把二维数组 a 的行地址传给了指标 p,指针指向行但不指向元素,因此,不能输出数组值。可将 for(p=a;p<a+6;p++)改为 for(p=*a;p<*a+6;p++)即可。
上例说明 a 是数组第 0 行的首地址,*a 是数组第 0 行第 0 列元素的首地址。
(七)动态空间分配函数的应用
应用动态空间分配函数 malloc()分配系统内存空间时易出错,如下程序:
#include<stdio.h>
main(){Char*p;p=malloc(8);gets(p);printf(“%s\n”,p);fress(p);return 0;}上述代码编译通过,但概念不正确,malloc(8)附值指针 p 前,编译程序假定了该返回值为整数,但指针 p 不能被理想的作为整数看待,需要对空间分配成功与否作出提前判定。
参考文献:
[1]庞新法 .C 语言中的指针运算 [J]. 价值工程,2014,(11):214-215. [2]曹雁 .C 语言指针与自增自减运算解析 [J]. 数码世界,2020,(3):54.
[3]许永达 .C 语言指针错误的分析及调试 [J]. 计算机系统应用,2013,(3):153-156.
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论