指针与字符串
用指针处理字符串
C语言中,采用数组对字符串的处理是一件比较麻烦的事情,而采用指针来处理字符串就得方便很多。通常将字符串作为一个整体来使用,用指针来处理字符串。当用指向字符串的指针来处理字符串时,并不关心存放字符串的数组大小,而只关心是否已处理到字符串的结束符。下面逐步分析如何用指针处理字符串。
1.用字符串数组处理字符串
C语言中只有字符串常量的概念,没有字符串变量的概念。字符串变量是通过字符数组来实现的。
利用字符数组处理字符串应用。程序代码:
#include
void main( ) {
char str1[40] = "Jiangxi Agriultural Univrsity”,
str2[ ]="School of Compuer and Information Engineering”;
int i=0;
printf(" %s\n" ,str1);
while (str2[i]!='\0')
printf("%c" ,str2[i++]);
printf(“\n”);
return ;
}
2.指向字符的指针变量处理字符串
可以不定义字符数组,而定义一个指向字符的指针变量,并将字符串的起始地址赋给指针变量,通过该指针变量亦可以实现字符串的操作。
用指向字符的指针变量处理字符串与用字符数组处理字符串的许多操作都类似,但也有许多不同之处。主要区别有:
(1)在用字符数组处理字符串时,可以认为是将整个字符串的内容赋给了字符数组(赋给了字符数组所开辟的存储单元中);但在用指向字符的指针变量处理字符串时,就不能认为是将整个字符串的内容赋给了指向字符的指针变量,而只是将字符串常量的指针赋给了该指针变量。因此,在用指针变量处理字符串时,只能认为该指针变量指向相应字符串的第一个字符(不是同时指向所有字符)。
(2)在定义一个数组时,在编译时即已分配内存单元,有确定的地址,该地址可以通过数组名来引用,数组名是数组第0个元素的指针,是指针常量。如果将字符串常量赋给了字符数组,数组名也就是字符串的指针。而定义一个指向字符的指针变量时,给指针变量分配内存单元,在其中可以放一个字符型指针,也就是说,该指针变量可以指向一个字符型数据,但如果未对它赋以一个指针,则它并未具体指向哪一个字符数据。 在将字符串常量赋给指针变量后(赋值的含意上面已经说明,此时可以称该指针变量“指向”相应的字符串),指针变量的值是字符串的指针,指针变量是可以被重新赋值的.即可以使指针变量重新指向其他字符,因此,在用指针变量处理字符串时,一定要注意指针变量的指向。
(3)在用字符数组处理字符串时要想将字符串常量直接赋给字符数组则只能通过初始化的方式来实现,否则就只能将字符串常量每个字符逐个赋给字符数组的每个元素,如:
char str[20] =Jiangxi Agricultural University”;
就不能写成:
char str1[20];
str1 =”Jiangxi Agricultural University" ;
但在用指向字符的指针变量处理字符串时,要想将字符串常量的指针直接赋给指向字符的指针变量,则可以用初始化的方式来实现,也可以用赋值的方式来实现。如:
char *str1 =" Jiangxi Agricultural University";
等价于:
char *str1;//定义指向字符的指针变量str1
str1 =”Jiangxi Agricultural University" ;//字符串的指针赋给指针变量str1
C语言中对数组元素的引用有下标法和指针法两种,如果是以严格地逐一递增递减的方式访问数组内容,则使用指针法更方便。字符串的访问一般是以趋向于严格地逐一访问的形式进行的,例如将整个字符串的内容输出。因此,许多字符串的操作通常使用指针和指针运算来实现。
字符串数组
1.字符串数组概念
前文中介绍过字符数组,这里提到的字符串数组有别于字符数组。字符数组是一个一维数组,而字符串数组是以字符串作为数组元素的数组,可以将其看成一个二维字符数组。字符串数组定义的例子如下:
char country[5][20] = "China","Japan","Russia"," Germany" ," Switzerland"} ;
字符型数组变量country被定义为含有5个字符串的数组,每个字符串的长度要小于20(考虑字符串结束标志符'\0').
通过观察上述定义可以发现China等这样的字符串的长度仅仅为5,加上字符串结束标志符也仅仅为6,而内在中却要给它们分别分配一个20个字节的空间,因此就会造成资源浪费为了解决这个问题可以使用指针数组,使每个指针指向所需要的字符常证这种方法出然需要在数组中保存字符指针,也占用空间,但要远少于字符串数组需要的空间。
2.使用指针数组处理字符串
指针数组特别合适于用来指向若干个字符串的问题,它将使字符串的处理更加方便灵活。
#include
void main()
{
int i;
char *month[]={
"January",
"February",
"March",
"April",
"May",
"June",
"July",
"August",
"September",
"October",
"November",
"December",
};
for(i=0;i
printf("%s\n",month[i]);
}
领取专属 10元无门槛券
私享最新 技术干货