c语⾔如何⽤指针来处理字符串?
⽂章⽬录
读者,你好!
如果你精通C,希望能得到你的斧正;如果你是初学者,希望能对你有所帮助。
加粗的是⼀些我认为⽐较重要的内容。
⼀、字符指针
1、字符指针输出字符串
为了更好的理解这部分内容,我们先看⼀个例⼦:
#include <stdio.h>
int main()
{
char*ps ;
ps ="C language!";/*定义字符指针*/
printf("%s\n", ps);/*⽤字符指针PS来输出字符串的内容*/
return0;
}
运⾏结果为:
这个列⼦中,字符串“C language!”, 存储在连续的⽆名存储区中,通过语句ps = "C language!, 将⽆名储存区的⾸地址赋给指针ps,也就是说,指针变量ps 指向⽆名储存区域的⾸地址,⽽不是把⽆名储存区域的内容保存在ps中,
C l a n g u a g e!\0
ps^
2、字符指针处理字符串
还是从具体的列⼦出发:
#include <stdio.h>
int main()
{
char*ps ="C language!";
int n =2;
ps = ps+2;/*移动指针ps*/
printf("%s\n", ps);
return0;
}
运⾏结果:
这⾥初始化的时候把⾸地址赋给了ps , 后⾯操作ps= ps+2时,ps指向l 所在的空间。
3、字符数组与字符指针处理字符串有何不同
占⽤空间不同。数组所占空间取决于数组的长度,⽽指针只占⽤4字节,⽤以存放字符串的⾸地址。
赋值⽅式不同指针本⾝是变量,所以可以这样char *ps; ps = "C language!"; 赋值, ⽽数组不能这样char A[20];A = "C language!;赋值,⽽要逐个赋值。
⼆、指针数组
指针数组的说明形式
printf怎么输出字符语法类型标识符 *数组名[整形常量表达式];
样列int *p[3];
说明“int *p[3];”表⽰p是⼀个指针数组名,他有三个元素p[0],p1],p[2],每个元素都是⼀个指针,⽽这些指针都指向整形变量。
注意不要写成int (*p)[3]; 这是上⼀篇说的指向数组的指针变量,表⽰长度为3的指向⼀维数组的指针变
量。
指针数组⽐较适合于⽤来指向若⼲个字符串,是字符串处理更加灵活⽅便。
⽐如图书馆有若⼲本书,要将这些书名存在⼀个数组中,⼀般的⽅法⽤⼆维数组来存,就得定义该字符数组的列数为最长书名的长度,这样就⾮常浪费空间。
⽤指针数组则可以让指针数组中的各个元素,指向各字符串(书名),这样排序时,不必改动字符串的位置,⽽是改动指针数组中个元素的指向。
这样,各字符串的元素可以不同,⽽且移动指针变量的值(地址),就⽐移动字符串所花的时间少得多。
#include <stdio.h>
#include <string.h>
#define N 5
int main()
{
char*name[N]={"Data Structure","Programming C","Java","Operating System","Data base"};
char*temp;
int i, j, front;
for(i =0; i < N -1;i++)
{
front = i;//假设按字典顺序,第i个书名应位于前
for(j= i +1;j < N;j++)
{
if(strcmp(name[front], name[j])>0)//判断其先后顺序是否合理
{
front = j;
}
}
if(front != i)//若顺序不合理,也就是原先的假设不成⽴,交换指针的值(地址)
{
temp = name[front];
name[front]= name[i];
name[i]= temp;
}
}
for(i=0;i<N;i++)
{
printf("%s\n", name[i]);
}
return0;
}
运⾏结果:
这段算法,后⾯部分与⼀般的数组差不多,但其效率却⽐较⾼。
三、指向指针的指针
由上⾯的内容可知,name 是⼀个指针数组,它的每⼀个元素都指向各字符串的⾸地址。⽽数组名name代表的是指针数组的⾸地址,所以name+i,就是name[i]的⾸地址。所以还可以设置⼀个指向指
针的指针变量p,它指向该指针数组。 源代码如下:
#include <stdio.h>
#define N 5
int main()
{
char*name[N]={"Data Sturcture","&C language","Basic","Fortran","Data base"};
char**p;
int i;
for(i =0; i < N;i++)
{
p = name + i;
printf("%s\n",*p);
}
return0;
}
送福利了

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。