C语言指针运用的基本问题及其典型例题分析
2019-02-12李菁
摘 要:文章分析了C语言指针的基本问题及其在使用中要注意事项并通过实例分析探讨了C语言指针的运用。最后,对C语言指针中的典型例题进行了讲解,以便加深对C语言指针的认识和理解。
关键词:C语言;指针;典型例题
指针,是C语言中的一个重要概念及其特点,也是掌握C语言比较困难的部分。指针也就是内存地址,指针变量是用来存放内存地址的变量,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。
1 指针基本问题
1.1 地址与指针
指针相对于一个内存单元来说,指的是单元的地址,该单元的内容里面存放的是数据。在C语言中,允许用指针变量来存放指针,因此,一个指针变量的值就是某个内存单元的地址或称为某内存单元的指针。
1.2 指针变量及其定义
指针变量是存放一个变量地址的变量,不同于其他类型变量,它是专门用来存放内存地址的,也称为地址变量。定义指针变量的一般形式为:类型说明符 *变量名
类型说明符表示指针变量所指向变量的数据类型;*表示这是一个指针变量;变量名表示定义的指针变量名,其值是一个地址,例如:char *p1;表示p1是一个指针变量,它的值是某个字符变量的地址。
2 指针使用中要注意事项,并举例说明
(1)不允许把一个数赋予指针变量,故下面的赋值是错误的。例如:
int *pointer;
pointer=200; //此处有错误
或者
int a=200;
int *pointer;
*pointer=a; //此處有错误
分析:前面例子中定义了一个指针变量pointer,但是不能直接把200赋值给指针变量pointer。后面的例子中定义了一个整型变量a,并赋初始值为200,又定义了一个指针变量pointer,这个变量指向整型数据,pointer中只能用来存放整型变量的地址,而不能直接把整型变量a赋值给这个指针变量pointer。所以可以把a的地址赋值给pointer;应改成:
int a;
int *pointer;
pointer=&a;
或者:
int a;
int *pointer=&a;
(2)不能企图通过改变指针形参的值而使指针实参的值改变。例如下面是错误的:
分析:程序运行时,从main函数开始执行,通过scanf函数给a和b赋值,输入8和10,将a的地址和b的地址分别赋值给指针变量ap1和ap2,使指针ap1指向a,ap2指向b。接着执行if语句,由于a
应改成:
(3)字符串指针指向的是一个字符串,例如下面是错误的:
int main( )
{ char *string1="I love China!";
printf("%c\n",string1); //此处有错误
return 0;
}
分析:string1是一个指针变量,指向字符串"I love China!",指针变量string1存放的是这个字符串的首地址。所以输出的是一个字符串,应改写成printf(“%s\n”,string1);
(4)函数指针变量的调用,以下是错误的:
分析函数指针变量不能进行算术运算,这是与数组指针变量不同的。数组指针变量加减一个整数可使指针移动指向后面或前面的数组元素,而函数指针的移动是毫无意义的。函数调用中“(*指针变量名)”的两边的括号不可少,其中的“*”不应该理解为求值运算,在此处只是一种表示符号。要把“z=*pomax(x,y);”改成“z=(*pomax)(x,y);”。
3 例题分析
(1)下列程序的输出结果是( )。
#include
main( )
{ static char *a[]={"Tokyo","Osaka","Sapporo","Nagoya"};
char **x;
x=a;
++x;
printf("%s\n",*x);
}
(A)Nagoya (B) Sapporo (C)Osaka (D)Tokyo
解答:选C
分析:a是一个指针数组,每个元素指向一个字符串,x是指向指针的指针变量,“x=a;++x;”如图1所示。
图1 程序的输出结果
(2)下列程序段的输出结果是( )。
#include
void fun(int *x,int *y)
{ printf("%d%d",*x,*y);
*x=3;
*y=4;
}
main( )
{ int x=1,y=2;
fun(&y,&x);
printf("%d%d",x,y);
}
(A)2 1 4 3 (B) 1 2 1 2 (C) 1 2 3 4 (D) 2 1 1 2
解答:選A
分析:主函数中“x=1,y=2;”调用函数fun(&y,&x)时,形参变量x',y'是两个指针变量,分别保存主函数中int型变量y,x的地址,即x' 2 ,y' 1 (主函数中x、y暂时不起作用);执行“printf(“%d%d”,*x,*y);”时,输出“2 1”;执行“*x=3;*y=4;”后返回,此时释放x',y',主函数中y=3,x=4。执行“printf(“%d%d”,x,y);”后再输出“4 3”。
4 结语
指针是C语言中一个重要的组成部分,但也最难理解。指针实际上就是地址,指针变量是用来存放指针(地址)的变量,只要理解指针的基本概念,掌握正确的使用方法,就可以从容地面对计算机等级考试中的指针试题,进一步加深对指针的理解,编出精彩、灵活的程序。
作者简介:李菁(1979— ),女,湖南津市人,讲师,硕士;研究方向:数据应用,数据挖掘。
Basic problems of the use of C language pointer and the analysis of its typical examples
Li Jing
(Hunan Vocational College of Electronic and Technology, Changsha 410000, China)
Abstract:Firstly, this paper analyzes the basic problems of C language pointer and the matters needing attention in its use. Secondly, the paper discusses the application of C language pointer through example analysis. Finally, the typical examples in C language pointer are explained in order to deepen the understanding and understanding of C language pointer.
Key words:C language; pointer; typical example