例如:
unsigned char ch = 'a'
unsigned char *ch_p = &ch
那么指针变量ch_p就是字符指针.
另外指向char类型的指针变量有部分也可以是字符指针, 因为char类型的范围是
-128 ~ 127, 而字符对应的ASCII码值范围是 0~255, 故从-128 ~ -1不可以表示字符!
而字符串指针则是指向字符串首地址的指针变量, 由于是字符串,所以指向的类型为char,例如:
char *str = "hello world"
那么指针变量str就是个字符串指针变量, 它指向了字符串常量"hello world"的首地址!
字符数组名与字符串指针变量名的区别2009-01-1919:08授课内容:
一、字符串指针变量的说明和使用
字符串指针变量的定义说明与指向字符变量的指针变量说明是相同的。只能按对指针变量的赋值不同来区别。
对指向字符变量的指针变量应赋予该字符变量的地址。如:
char
c,*p=&c表示p是一个指向字符变量c的指针变量。而:
char
*s="c
language"则表示s是一个指向字符串的指针变量。把字符串的首地址赋予s。
请看下面一例。main(){
char
*ps
ps="c
language"
printf("%s",ps)
}
运行结果为:
c
language
上例中,首先定义ps是一个字符指针变量,
然后把字符串的首
地址赋予ps(应写出整个字符串,以便编译系统把该串装入连续的一
块内存单元),并把首地址送入ps。程序中的:
char
*ps
ps="c
language"等效于:
char
*ps="c
language"
输出字符串中n个字符后的所有字符。
二、字符指针变量的运算
main(){
char
*ps="this
is
a
book"
int
n=10
ps=ps+n
printf("%s\n",ps)
}
运行结果为:
book
在程序中对ps初始化时,即把字符串首地址赋予ps,当ps=
ps
+10之后,ps指向字符“b”,因此输出为"book"。
main(){
char
st[20],*ps
int
i
printf("input
a
string:\n")
ps=st
scanf("%s",ps)
for(i=0ps[i]!='\0'i++)
if(ps[i]=='k'){
printf("there
is
a
'k'
in
the
string\n")
break
}
if(ps[i]=='\0')
printf("there
is
no
'k'
in
the
string\n")
}
本例是在输入的字符串中查找有无‘k’字符。
三、字符串指针作为函数参数的使用。
要求把一个
字符串的内容复制到另一个字符串中,并且不能使用strcpy函数。函
数cprstr的形参为两个字符指针变量。pss指向源字符串,pds指向目标字符串。表达式:
(*pds=*pss)!=`\0'
cpystr(char
*pss,char
*pds){
while((*pds=*pss)!='\0'){
pds++
pss++
}
}
main(){
char
*pa="china",b[10],*pb
pb=b
cpystr(pa,pb)
printf("string
a=%s\nstring
b=%s\n",pa,pb)
}
在上例中,程序完成了两项工作:一是把pss指向的源字符复制
到pds所指向的目标字符中,二是判断所复制的字符是否为`\0',若
是则表明源字符串结束,不再循环。否则,pds和pss都加1,指向下
一字符。
四、使用字符串指针变量与字符数组的区别
用字符数组和字符指针变量都可实现字符串的存储和运算。
但两者是有区别的。在使用时应注意以下几个问题:
1.
字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。
2.
对字符数组作初始化赋值,必须采用外部类型或静态类型,如:
static
char
st[]={“c
language”}而对字符串指针变量则无此限制,如:
char
*ps="c
language"
3.
对字符串指针方式
char
*ps="c
language"可以写为:
char
*ps
ps="c
language"
而对数组方式:
static
char
st[]={"c
language"}不能写为:
char
st[20]
st={"c
language"}而只能对字符数组的各元素逐个赋值。
从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。
前面说过,当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。但是对指针变量直接赋值是可以的。因为c系统对指针变量赋值时要给以确定的地址。因此,
char
*ps="c
langage"或者
char
*ps
ps="c
language"都是合法的。