原创 C指针温习(四):字符串与指针

2007-12-26 21:36 5801 1 1 分类: MCU/ 嵌入式

C语言中,访问字符串有两种方法,第一种就是在字符数组里面存放一个字符串,然后输出该字符串。这个比较简单。然后第二个就是用字符指针指向一个字符串。


举一个例子:


#include <stdio.h>


<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

 


void main()


{


    char * string = "I love likee!";


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


}


这里没有字义字符数组,而是定义了一个字符指针变量string,用字符串常量I love likee!对它进行初始化。C语言对字符串常量是按字符数组处理的。在内存中开辟了一个字符数组用来存放该字符串常量。对字符串的初始化是把第一个元素的地址(也就是首元素的地址)赋给了string,而不是把I love likee!这几个字符赋给了字符串变量。这是不对的。定义string的部分:


char * string = "I love likee!";


等价于下面两行:


char * string


string = "I love likee!";


将一个字符串从一个函数传递到另一个函数,可以使用地址传递的方法,即用字符数组名作为参数,也可以使用指向字符的指针变量作为参数。在被调用的函数中可以改变字符串的内容,在主调函数中可以得到改变了的字符串。


1、  用字符数组作为参数:


#include <stdio.h>


 


void main()


{


    void copy_string(char from[],char to[]);


    char from[] = "I love likee!";


    char to[] = "I like likee!";


    char * a = from, * b = to;


    printf("string a = %s\nstring b = %s\n",a,b);


    printf("copy string a to string b :\n");


    copy_string(a,b);


    printf("\nstring a = %s\nstring b = %s\n",a,b);


    getch();


}


 


void copy_string( char from[],char to[])


{


    int i = 0;


    while (from!='\0')


    {


        to[i+13] = from;


        i++;


        to[i+13] = '\0';


    }


}


它的输出是:


string a = I love likee!


string b = I like likee!


copy string a to string b :


string a = I love likee!


string b = I like likee!I love likee!


2、  形参用字符指针变量:


这只需要将子函数copy_string改为下面形式即可:


void copy_string( char * from,char * to )


{


    for( ;* from!= '\0';from++,to++ )


    * to = * from;


    * to = '\0';


}


我们还可以对copy_string函数作简化


(1)       copy_string写成:


void copy_string( char * from,char * to )


{


       while((* to = * from) !=’\<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />0’)


    {to++;from++;}


}


(2)还可以写成:


{


       While ((* to++ = * from++) !=’\0’);


}


虽然用字符数组和字符指针变量都能实现字符串的存储和运算,但它们两者之是有区别的。主要有下面几点:


(1)               字符数组由若干个元素组成,每个元素中放一个字符,而字符指针变量中存放是地址(字符串第一个字符的地址),决不是将整个字符串放到字符指针变量当中。


(2)               赋值方式。对字符数组只能对稳中有降个元素赋值,不能用以下办法对字符数组赋值:


char str[14];


str = "I love likee";


但是对于字符指针变量,可以采用下面的方法赋值:


char * a;


a = "I love likee";


3如果定义了一个字符数组,在编译的时候主它分配了内存元,它有确定的地址。而定义一个字符指针变量时,给指针变量分配内存单元,在其中可以放一个字符变量的地址,即:该指针变量可以指向一个字符型数据,但如果未对它赋以一个地址值,则它并未具体指向一个确定的字符数据。


例:


char str[10];


scanf("%s",str);


是可以的。但是有些人这样子写:


char * a;


scanf("%s",a);


这样虽然能够运行,但是很危险,决不提倡。因为它编译的时候虽给指针变量a分配的内存单元,a的地址已经定了,但是a的值并不定。在a 单元中是一个不可预料的值,但是在执行scanf的时候要求将一个字符串输入到a所指向的一段内存单元(即以a的值开始的一段内存单元中)。但如今a不可预料。所以这样会破坏用户的内存。破坏了系统。


(3)               指针变量的值是可以改变的。如:


#include <stdio.h>


 


void main()


{


    char * a = "I love likee!";


    a += 7;


    printf("%s",a);


    getch();


}


它的输出为:likee!。


(4)               用指针变量指向一个格式字符串,可以用它代替printf函数中的格式字符串。


比如:


char * format;


format = "a = %d,b + %f\n";


printf(format,a,b);


它相当于:


printf("a = %d,b + %f\n",a,b);

文章评论0条评论)

登录后参与讨论
相关推荐阅读
daiqiumiao_806246054 2011-01-06 13:57
linux下yum代理设置
    我们在安装好linux后,经常会使用yum来更新系统,但是系统默认的代理是国外的,国内一般的网络不能访问,这里讲解具体做法,把代理换成国内的。attachment download      ...
daiqiumiao_806246054 2010-12-30 09:48
【转】ORACLE 10g下载地址
Oracle Database 10g Release 2 (10.2.0.1.0) Enterprise/Standard Edition for Microsoft Windows (32-bit...
daiqiumiao_806246054 2010-11-29 11:06
找工作的进来看
如下是我所有的开放性问题回答,希望对大家有帮助!1.      When choosing your first job/employer, what will you consider and wh...
daiqiumiao_806246054 2010-11-29 09:47
中长期规划---螺旋式上升方式修改完善职业之路
一、中长期职业发展的自我准备1、心态上随时做好准备 机会是给有准备的人的------“有准备”是你在做准备的过程中让“别人”认为你“有准备”!别人是包括你现在的老板和别的老板,以及你身边的人!他们对你...
daiqiumiao_806246054 2010-03-17 21:26
移动
分集方式传输损耗和距离关系光纤网络G网...
daiqiumiao_806246054 2010-03-17 09:40
GSM
特点  使用直观  GSM系统有几项重要特点:防盗拷能力佳、网络容量大、手机号码资源丰富、通话清晰、稳定性强不易受干扰、信息灵敏、通话死角少、手机耗电量低。  技术特点  1.频谱效率。由于采用了高效...
广告
我要评论
0
1
广告
关闭 热点推荐上一条 /3 下一条