指针-引用字符串

在 C 语言中,由于没有字符串这个变量类型, 所以字符串是存放在字符串数组中的。


如果我们想引入一个字符串,有以下两种方式。


1.用字符数组存放一个字符串,可以通过数组名和下标引用字符串中的一个字符,也可以通过数组名和格式声明"%s"输出该字符串。


 

#include <stdio.h>
int main(){
     char string[] = "I love China!";
     printf("%s\n",string);
     printf("%c\n",string[7]);
     return 0;

}


这里,我们先解释下,字符串数组在内存中所占的字节数,


在上面例子中,我们可以得知,string变量的长度是13,但它的精确长度应该是14。


因为在内存中,最后一个字节存放着字符串的结束符'\0', 用于表示这个字符串的结束,


根据以前数组指针的概念,这里数组名string代表字符数组首元素的地址,


那么通过*string 就可以得到字符数组中第一个字符的值,


*(string+7) 就是字符数组中第7个字符的值。


这里我们要注意的是,当用指针方式取某一个字符时,前面的格式声明必须是 %c,而不是%s,


%s这个声明是获取整个字符数组的内容的,当遇到结束符'\0',是才会结束。




2.用字符指针变量指向一个字符串常量,通过字符指针变量引用字符串常量。

 

#include <stdio.h>

int main(){
   char * string = "I love China!";
   printf("%s\n",string);
   return 0;

}

 

在这里,我们并没有定义一个字符数组,只是定义了一个char * 型 变量(字符指针变量),用字符串"I love China!"对它初始化。


C语言对字符串常量是按字符数组处理的,在内存中开辟了一个字符数组用来存放该字符串常量,


但是这个字符数组是没有名字的,因此不能数组名来引用,只能通过指针变量来引用。


对于上述的字符串变量string的初始化,实际上是把字符串的第一个元素的地址(即存放字符串的字符数组的首元素地址)赋给指针变量string,使string指向字符串的第一个字符


在不至于误解的情况下,为了方便起见,有时也可以说,string指向字符串"I love China!",


但应该理解为指向字符串的第一个字符。



而printf("%s\n",string); 


这条语句,就是打印出字符数组中所有的字符。


这里,我们可能有一些疑惑,首先,string是一个地址,我们在前面使用int类型的数组时,不是打印出它的地址的吗



而用取值符号 * 才是获取string的值啊。



但是,这里我们要记住,如果我们用* 来取值的话,那么前面的格式符号就一定是%c了。


因为 通过* 来取值的话,肯定是去字符数组中的一个字符元素了。


但如果我们直接使用%s,而后面直接跟上数组元素的首地址的话,


那么C解释器在解释这段代码是,会自动移动该字符指针的位置,将该字符指针对给定的值给输出来,


知道遇到结束符'\0',则停止。



下面我们给一个例子,具体的展示结束符的作用



例: 将字符串a复制为字符串b,然后输出字符串b。

 

#include <stdio.h>
int main(){
    char a[] = "I am a student.",b[20];
    int i;
    for(i=0;*(a+i)!='\0';i++)
         *(b+i) = *(a+i);
    *(b+i) = '\0';
    printf("string a is:%s\n",a);
    printf("string b is:");
    for(i=0;b[i]!='\0';i++)
         printf("%c",b[i]);
    printf("\n");
    return 0;

}
 

上述例子中,我们定义了两个字符数组,一个有值,一个为空,


首先,我们循环字符数组里的值,我们用字符数组中最后一个结束符来判断循环的终止


并且在赋值结束时,我们给b添加一个结束符'\0',


如此,我们就可以输出b的值了。

 

上述的例子也可以改成

 

#include <stdio.h>
int main(){
    char a[] = "I am a student.",b[20];
    int i;
    for(i=0;*(a+i)!='\0';i++)
         *(b+i) = *(a+i);
         
    *(b+i) = '\0';
    printf("string a is:%s\n",a);
    printf("string b is:%s\n",b);
    printf("\n");
    return 0;

}
 

接下来,我们通过用指针的方式来解决上述问题。

 

#include <stdio.h>
int main(){
     char a[]="I am a boy.",b[20],*p1,*p2;
     p1=a;p2=b;
     for(;*p1!='\0';p1++,p2++)
           *p2=*p1;
     *p2='\0';
     printf("string a is:%s\n",a);
     printf("string b is:%s\n",b);
     return 0;

}
 

 

 

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值