指向字符串的指针变目
通常所说的字符串指针就是指向字符率某字符的字符指针。因字符率存储于字符数组中,所以字符串指针也就是指向数组元素的指针。
为程序中引入的字符串常量提供存储空间有两种方法。一是把字符率常量存放在一个字符数组中。例如,
char s[]=“I am a string.”;
数组s共有15个元素,其中 s[14] 为'\0' 字符。对于这种情况,编译程序根据字符串常量所需的字节数为字符数组分配存储,并把字符串复写到数组中,即对数组初始化。另一种方法是由编译系统将字符串常量与程序中出现的其它常量一起存放在常量存储区中。程序为了能访问存于常量存储区中的字符串常量,可用一个字符指针指向它的第一个字符。当字符串常量出现在表达式中时,系统将字符率常量放入常量存储区,而把表达式转换成字符指针,指向该字符串常量的第一个字符。因此,可在定义字符指针变量时给它初始化指向某字符串常量,或用字符申常量给字符指针变量赋值,这两种方法都使字符指针指向字符串常量的第一个字符。例如,
char *cp1,*cp2=“I am a string”;/*定义字符指针变量,并赋初值*/
cp1=“Another string”;/* 先定义字符指针变量,然后按需要赋初值*/
上述代码使字符指针变量cp2指向字符率常量“I am a string”的第一个字符I,使cpl指向字符串常量“Another string”的第一个字符 A.
指向二维数组中的某个一维数组的指针变量
如有一个二维数组,且指针变量所指的是二维数组中的一整行,则指针变量另有一些很有意义的性质。设有二维数组为
int a[3][4]={{1,2,3,4},{5,6,7,8 },{ 9,10,11,12 }};
这里,数组a有3行4列。按行来看数组a,数组a有三个元素,分别为a[0],a[1],a[2].它们又分别是一个一维数组,各有4个元素。例如,a[0]所代表的一维数组为
a[0][0] 、a[0][l] 、a[0]p[2], a[0][3].
一维数组名表达式的值是数组首元素(下标为0)的地址,二维数组名a表达式是a的首行a[0]的地址。一般地,a+i可以看作二维数组a的第i+1行的首地址。
因二维数组a能用a[0].a[1]、a[2] 分别表示它的各行,所以a[0]能表示用a[0]标记的 a的第一行的首元素 a[0][0] 的地址;a[1] 能表示用 a[l] 标记的 a的第二行的首元素 a[l][0] 的地址。一般地,a[i]能表示用 a[i]标记的a的第i+1行的首元素a[i][0]的地址。由于数组的开始地址与数组首元素的地址相同,这样,a+i与a[i]应有相同的值,但它们的意义不同,a+i表示用a[i]标记的a的第i+1行的首地址,a[i]表示用a[i]标记的a的第i+l行的首元素a[i][0]的地址。另外,因a[i]可写成*(a+i),所以a+i与*(a+i)也有不同意义,而值相等。a[i]或*(a+i) 表示二维数组a的元素a[i][0]的地址,即&a[i][0].根据地址运算规则,a[i]+j即代表数组a的元素a[i][j]的地址,即&a[i][j].因a[i]与*(a+i)等价,所以*(a+i) +j也与&a[i][j]等价。
由二维数组元素a[i][j]的地址有多种表示形式,数组元素a[i][j]也有以下三种等价表示形式:*(a[i]+j)、*(*(a+i)+j)、(*(a+i))[i].特别是对于a[0][0],它的等价表示形式有*a[0]和**a.数组元素a[i][j]的地址也有三种等价的表示形式:a[i]+j、*(a+i)+j、&a[i][j] .
也可以定义指向二维数组中某行由若干个元素所组成的一维数组的指针变量。如代码int (*p)[4];
定义指针变量p能指向一个由四个int型元素组成的数组。指针变量p不同于前面介绍的指向整型变量的指针。在那里,指向整型变量的指针变量指向整型数组的某个元素时,指针增减1运算,表示指针指向数组的下一个或前一个元素。在这里,p是一个指向由四个整型元素组成的数组,对p作增减1运算,就表示向前进或向后退四个整型元素。用例子说明指向由若干个元素所组成的数组指针的用法,如有变量定义int a[3][4],(*p)[4] ;
则赋值p=a+l,使p指向二维数组a的第二行,表达式p+l的值为指向二维数组a的第三行。同二维数组元素的地址计算规则相对应,若 P=a+1,则*p+j指向a[l][j];*(p+i) +j,或者p[i]则指向数组a的元素a[i+l][j].二维数组名和指向数组的指针与数组元素位置之间的关系。
指针变安的定义、初始化和引用
指针变量用于存放某个变量的地址。定义指针变量的一般形式为:类型 * 指针变量名;或类型 * 指针变量名=初值表达式;
其中,指针变量名是标识符,指针变量名之前的符号“*”,表示该变量是指针类型的。而最前面的“类型”,表示该指针变量能指向变量或函数的类型。初值表达式是一个地址表达式,如表达式中有某变量的地址表达式,则这个变量应是前面已定义的。
在C语言中,当定义局部指针变量时,如未给它指定初值,则其值是不确定的。程序在使用它们时,应首先给它们赋值。误用其值不确定的指针变量间接引用其它变量,会引起意想不到的错误。为明确表示指针变量不指向任何变量,在C语言中用0值表示这种情况,记为NULL.如
ip= NULL;
也称指针值为0的指针变量为空指针。对于静态的指针变量,如在定义时未给它指定初值,系统自动给它指定初值0.
指针变量取程序对象的(开始)地址值,不能将一个整型量或任何其它非地址值赋给一个指针变量。另外,指针变量对所指向的对象也有类型限制,不能将一个不能指向的对象的地址赋给指针变量。如有以下定义:
int i=100,j,*ip,*intpt;
float f,*fp;
以下代码如注释所叙。
iP=&i;/*使ip指向i*/
intpt=ip;/*使intpt指向ip所指变量*/
fp= &f;/*使fp指向正*/
ip=NULL;/*使 ip不再指向任何变量*/
相关推荐:
北京 | 天津 | 上海 | 江苏 | 山东 |
安徽 | 浙江 | 江西 | 福建 | 深圳 |
广东 | 河北 | 湖南 | 广西 | 河南 |
海南 | 湖北 | 四川 | 重庆 | 云南 |
贵州 | 西藏 | 新疆 | 陕西 | 山西 |
宁夏 | 甘肃 | 青海 | 辽宁 | 吉林 |
黑龙江 | 内蒙古 |