Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1097319
  • 博文数量: 242
  • 博客积分: 10209
  • 博客等级: 上将
  • 技术积分: 3028
  • 用 户 组: 普通用户
  • 注册时间: 2008-03-12 09:27
文章分类

全部博文(242)

文章存档

2014年(1)

2013年(1)

2010年(51)

2009年(65)

2008年(124)

我的朋友

分类: C/C++

2008-04-17 18:02:22

使用字符串指针变量与字符数组的区别
    用字符数组和字符指针变量都可实现字符串的存储和运算。但是两者是有区别的。在使用时应注意以下几个问题:

1.     字符串指针变量本身是一个变量,用于存放字符串的首地址。而字符串本身是存放在以该首地址为首的一块连续的内存空间中并以‘\0’作为串的结束。字符数组是由于若干个数组元素组成的,它可用来存放整个字符串。

2.     对字符串指针方式

char *ps="C Language";

可以写为:

    char *ps;

ps="C Language";

而对数组方式:

    static char st[]={"C Language"};

不能写为:

    char st[20];

    st={"C Language"};

而只能对字符数组的各元素逐个赋值。

     从以上几点可以看出字符串指针变量与字符数组在使用时的区别,同时也可看出使用指针变量更加方便。

当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。
一个错误的例子,如下:       
           char *name;
           scanf("%s",name);
           printf("%s",name);
 
有的编译器虽然也能通过,但这是错误的,因为是个指针,定义时指向不可用的地址。解决这个问题有两种方法:用数组的方法或给字符针针分配内存空间的方法。
           数组的方法:
                 char name[20];
                 scanf("%s",name);
                 printf("%s",name);
     
        给字符针针分配内存空间的办法:
                 char *name;
                 name=(char*)malloc(50);      //此时name已经指向一个刚刚分配的地址空间。
                 scanf("%s",name);
                 printf("%s",name);

但是对指针变量直接赋值是可以的。因为C系统对指针变量赋值时要给以确定的地址。

3.int  main()
{
 char str1[40]="hello world!";     //char *str1="hello world!";
 str1[4]='A';                      //若str1是指针型的,编译通过,但运行是此处会段错误
 printf("%s\n",str1);
 return 0;
}
阅读(1355) | 评论(2) | 转发(0) |
给主人留下些什么吧!~~

wqfhenanxc2008-05-07 09:59:37

你连邮箱都没有留,我怎么给你发邮件啊。 str1是指针型时,“hello world!”是一个字符串常量,放在内存里,str1指向其内存地址。 什么是字符串常量呢?就是我们不能更改起内容的字符串。所以str1[4]='A';这样赋值就会出错。 至于为什么是运行出错而不是编译出错,我想这是编译器的问题。我用的是gcc编译器,他可能并不知道str1指向的是一个字符串常量,我们当然可以设计自己的编译器让它识别这样的错误使程序在编译时就报错。

4678466572008-05-06 16:41:44

在最后的这段代码里 star1[4]='A';//若str1是指针型的,编译通过,但运行是此处会段错误 是为什么啊?? 希望兄弟能解答一下~~ 急,最好能发个邮件~