内容正文:
12.指针(讲义)-《C语言程序设计》专题复习讲练测
[考纲要求]
(1)了解指针变量的定义及引用
(2)理解指向数组的指针变量。
[课时安排]
4课时
[知识梳理]
1. 指针变量的定义及引用
(1) 指针变量的定义
指针变量的定义格式为:
存储类型 类型标识符 *指针变量名
其中,指针变量名前加了“*”号表示该变量是指针变量,而“类型标识符”表示该指针变量所指向的变量的类型。指针存储类型是指该变量的存储属性。与普通变量一样,不同存储类型的指针使用不同的存储区。一个指针变量只能指向同一种类型的变量,也就是说,不能定义一个指针变量,它既能指向一整型变量又能指向双精度变量。
例如:
char*pc1,*pc2;
int*pa,*pb;
float*px,*py;
表示定义了6个指针变量pc1、pc2、pa、pb、px、py。pc1可以指向一个字符型变量,pa可以指向一个整型变量,px可以指向一个实型变量,换句话说,pc1、pa、px可以分别存放字符型变量的地址、整型变量的地址、实型变量的地址,定义形式如下:
(2) 指针运算符
&运算符:取地址运算符,&a的值为a的地址。
*运算符:指针运算符或指向运算符,也称间接运算符,*pa代表pa所指向的变量。
(3) 指针变量的引用
定义了一个指针变量之后可以对该指针变量进行各种操作,例如给一个指针变量赋予一个地址值。输出一个指针变量的值。访问指针变量所指向的变量等。常用的指针变量的使用方法如下:
注:在指针引用前要对它进行初始化,只有给指针赋初值后才可引用指针。
(4) 指针初始化
对于静态存储指针变量,其自动初始化为NULL,即0,该指针不指向任何有效数据单元,有时也称指针为空指针,如:
其中pa、pb初始化为NULL。
对于动态存储指针变量,可以对其赋值,也可以在定义指针变量时初始化,就像普通变量定义时初始化一样,还可以用new操作符分配动态内存,如:
2.指向数组的指针变量
指针变量也可以指向数组元素的内存地址,可以利用指针来访问数组的元素。当声明一个数组变量后,C编译器会为该数组分配连续的存储空间,用于存储数组内的元素,每个元素占用的空间为该元素所属数据类型的空间大小。
一个指针变量可以指向一个数组,也可以指向一个数组元素。将一个数组的地址赋值给指针变量可以写为:
p = a;
该语句将数组a的首地址赋值给指针变量p。当把一个数组元素的首地址,一般是数组第一个元素的地址赋值给指针变量时,该指针变量是指向了数组第1个元素的内存地址,然后应用指针的加减运算就可以访问数组的全部元素。
上图描述了指针与数组元素内存地址的关系。array为具有三个短整型元素的数组,p为短整型的指针,p=array将数组array首地址赋值给p,此时指针变量p指向数组array的第1个元素,p+1指向第2个元素,p+2指向第3个元素。
一个指针变量既可以指向一个数组,也可以指向一个数组元素。如果要使指针指向数组的第一个元素,可以把数组名或第一个数组元素的地址赋值给该指针变量。如果需要该指针指向第i个元素的地址,可以把第i个元素的内存地址或数组名加i赋值给该指针。
int data[]={11,21,23};
int *p;
// 数组data第2个元素地址赋值给p
p = data+1;
// 或者
p = &data[1];
上面的代码将data数组的第2个元素的内存地址赋值给指针变量p。当指针变量p指向了数组元素或数组首地址后,就可以通过指针变量的自增或自减来访问数组的各个元素。
[真题练讲]
一、程序分析
1.(2014年苏南五市单招)阅读下列程序,并把运行结果填写在___________答题处。
#include <stdio.h>
#include <conio.h>
#define N 80
fun(char s[])
{
int i,j;
for(i=0,j=0;s[i]!='0';i++)
if(s[i]>'z'||s[i]<'a' && s[i]>'Z'||s[i]<'A')
{
s[j]=s[i];
j++;
}
s[j]='\0';
return(j);
}
main()
{
char str[N]="ab123$df4";
int s;
puts(str);
s=fun(str) ;
puts(str);
printf("There are %d char in the new string.",s);
}
答案:There are 4 characters in the new string
解析:在main函数中,声明了一个字符数组str,并初始化为"ab123$df4"。使用puts(str)打印出初始字符串"ab123$df4"。调用函