c语言之字符串与指针
1.概念
字符串是存放在字符数组中的,对字符数组中的字符逐个处理时,通常将字符串作为一个整体来使用,用指针来处理字符串更加方便。当用指向字符串的指针来处理字符串时,并不关心存放字符串的数组大小,而只关心是否已处理到字符串的结束符。
使用指针进行字符串的拷贝:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char strfrom[30]="i am a good student";
char strto[30]="0";
char *p1=strfrom;
char *p2=strto;
printf("kao bei qian \n ");
printf("strfrom is: %s\n",strfrom);
printf(" strto is: %s\n",strto);
for(;*p2++=*p1++;);
printf("kao bei hou \n ");
printf("strfrom is: %s\n",strfrom);
printf(" strto is: %s\n",strto);
return 0;
}
*p2++=*p1++ 等价于下列三条语句,
*p1=*p2; // s2[i]=s1[i],将指针p1所指s1[i]赋给指针p1所指s2[i]。
p1++; //指针p1加1指向s1的下一个元素
p2++; //指针p2加1指向s2的下一个元素
上述语句不断循环,直到p1指向结束字符'\0'=0时,for 语句因条件为假而结束。从而完成字符串s1拷贝到字符数组s2的任务。
2.字符型指针变量与字符数组的区别
(1)分配内存
设有定义字符型指针变量与字符数组的语句如下:
char *p ,str[50];
则系统将为字符数组str分配50个字节的内存单元,用于存放50个字符。而系统只为指针变量p分配4个存储单元,用于存放一个内存单元的地址。
(2)初始化赋值含义
字符数组与字符指针变量的初始化赋值形式相同,但其含义不同。例如:
char str[50] ="I am a student ! " ;
char *p="You are a student ! " ;
对于字符数组,是将字符串放到为数组分配的存储空间去,而对于字符型指针变量,是先将字符串存放到内存,然后将存放字符串的内存起始地址送到指针变量p中。
(3)赋值方式
字符数组只能对其元素逐个赋值,而不能将字符串赋给字符数组名。对于字符指针变量,字符串地址可直接赋给字符指针变量。例如:
str="I love C! "; //字符数组名str不能直接赋值,该语句是错误的。
p="I love C! "; //指针变量p可以直接赋字符串地址,语句正确
(4)值的改变
在程序执行期间,字符数组名表示的起始地址是不能改变的,而指针变量的值是可以改变的。例如:str=str+5; //错误
p=str+5; //正确