用指针和用数组名访问内存的方式几乎完全一样,却又有微妙而重要的差别。指针是地址变量,数组名则是固定的某个地址,是常量。
若定义一个数组:
int a[10];
则在内存中占有从一个基地址开始的一块足够大的连续的空间,以包容a[0],a[1]…,a[9]。基地址(或称为首地址)是a[0]存放的地址。其他依下标顺序排列。
若定义一个指针:
int*p;
则意味着:p=&a[0];即
p指向a[0]
p+1指向a[1]
p+2指向a[2]
…
p+i=&a[i];
p+i指向a[i](i=0,…,9)
1)在C语言中,数组名本身是指向零号元素的地址常量。因此,p=&a[0]可写成p=a,a当作常量指针,它指向a[0].p=a+i与p=&a[i]等价,故数组名可当指针用,它指向0号元素。
2)若定义p为指针,a为数组名,且p=a,则p+i指向a[i],a+i也指向a[i]。这样,a[i]与*(p+i)或*(a+i)可看成是等价的,可互相替代使用。
注意:
由于a只是数组名,是地址常量,而不是指针变量,所以可以写p=a,但不能写a=p,可以用p++,但不能用a++。
2.字符串指针
在C语言中,可用char型数组来处理字符串,而数组又可用相应数据类型的指针来处理。所以可以用char型指针来处理字符串。通常把char型指针称为字符串指针或字符指针。
【例7-5】计算串长度的函数strlen()是使用字符串指针的一个实例。(www.xing528.com)
执行结果:
H
6
e
定义字符指针可以直接用字符串作为初始值,来初始化字符指针。例如:
这样的赋值并不是将字符串复制到指针中,只是使字符指针指向字符串的首地址。但对于数组操作,例如:
char text[80];
则不可写成:
text=“Hello!”;
因为,此处text是数组名,而不是指针,只能按字符数组初始化操作。即:
static char text[80]={“Hello!”};
当字符串常量作为参数(实参)传递给函数时,实际传递的是指向该字符串的指针,并未进行字符串复制。
【例7-6】向字符指针赋字符串。
执行结果:
此例中字符串是逐个字符输出,也可以字符指针为参量,作字符输出,例如:
【例7-7】以字符指针为参数来调用串比较函数strcomp()。
s和t初值已由实参传递过来了,所以for语句的第一个表达式为空语句。用指针处理字符串的复制,比用数组处理更精练,例如:
如果用数组处理则要复杂些,例如:
直接演化出指针处理,即:
优化后便是如前所示的指针处理方法的程序。其中,也使用了空语句(;),而且不必进行与‘\0’的比较。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。