(1)在C中,是将字符串作为字符数组来处理的。
可以用字符串常量来使字符数组初始化。例如:char c[]=”I am happy”;因为字符串常量的最后由系统自动加入一个’/0’。因此,上面的初始化与下面的初始化等价。
char c[]={‘I’, ’ ‘ ,’a’, ’m’,’ ‘,’h’,’a’,’p’,’p’,’y’,’/0’};数组的长度为11。
(2)赋值方式。对字符数组只能对各个元素赋值,不能用以下办法对字符数组赋值:
char str[14];
str=”I love China!”;
而对字符指针变量,可以采用下面办法赋值:
char *a;
a=”I love China!”;
(3)对字符数组的初始化 char str[14]= ”I love China!”不能等价于
char str[14];
str[]=”I love China!”;
即数组可以在定义时整体赋值,但不能在赋值语句中整体赋值。只能初始化,不能赋值。
(4)如果定义了一个字符数组,在编译时为它分配内存单元,它有确定的地址。
而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址。
例如:
char str[10];
scanf(“%s”,str);
是正确。
但 char *a;
Scanf(“%s”,a);
是危险的,虽然一般能运行,当绝不提倡。因为编译是虽然给指针变量a分配了内存单元,a的地址(&a)已经指定,但a的值并未指定,在a单元中是一个不可预料的值。a可能指向一段空白未用的存储区,也有可能指向已存放指令或数据的有用内存段,这就破坏了程序,甚至破坏了系统。正确的应该这样:
char *a,str[10];
a=str;
scanf(“%s”,a);
(5)注:strlen()没有包括字符串末尾的‘/0’.
Void test()
{
char string[10],str[10];
int i;
for(i=0;i<10;i++)
str[i]=’a’;
strcpy(string,str);
}
错误:首先,strcpy(string,str)调用使得从str内存起复制到string内存起所复制的字节数具有不确定性。因为strcpy(char *dest,const char *src)的工作方式是从src起一直复制出现‘/0’才停止复制。
自己写一个strcpy函数:
char *strcpy(char *strDest,const char *strSrc)
{
assert((strDest!=NULL) && (strSrc!=NULL));
char *address=strDest;
while((*strDest++ = *strSrc++)!=’/0’);
return address;
}
(6)
swap(int *p1,int *p2)
{
int *p;
*p=*p1;
*p1=*p2;
*p2=*p;
}
在上面的swap函数中,p是一个“野”指针,有可能指向系统区,导致出现运行的崩溃。
应该改为:
swap(int *p1,int *p2)
{
int p;
p=*p1;
*p1=*p2;
*p2=p;
}