博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
字符串指针与字符数组的区别
阅读量:4563 次
发布时间:2019-06-08

本文共 1825 字,大约阅读时间需要 6 分钟。

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

  当一个指针变量在未取得确定地址前使用是危险的,容易引起错误。

一个错误的例子,如下:       
           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系统对指针变量赋值时要给以确定的地址。初始化指针时所创建的字符串常量被定义为只读。

  int  main()
{
   char str1[40]="hello world!";     //char *str1="hello world!";
   
str1[4]='A';                      //若str1是指针型的,编译通过,但运行是此处会段错误
   printf("%s\n",str1);
   return 0; 
}

 

       数组和指针都可以在它们的定义中用字符串常量进行初始化,尽管看上去一样,底层的实现机制却不相同。

       定义指针时,编译器并不为指针所指向的对象分配空间,它只是分配指针本身的空间,除非在定义的同时赋值给指针一个字符串常量进行初始化。例如:下面的定义创建了一个字符串常量(为其分配了内存):    char *p=”abcdefg”;

    

注意:

  1. 在ANSI C中,初始化指针时所创建的字符串常量被定义为只读。如果试图通过指针修改这个字符串的值,程序就会出现未定义的行为。在有些编译器中,字符串常量被存放在只允许读取的文本段中,以防止它被修改。
  2. 数组也可以用字符串常量进行初始化:   Char a[]=”abcdefg”;     和指针相反,由字符串常量初始化的数组是可以修改的。其中的单个字符在以后可以改变。
  3. 下面是一个在vc6中的一个例子,完成将一个字符串中的所有大写字母全部转换为小写字母的功能: int strlower(char *string)   {       if(string==NULL)      {           return -1;      }         while(*string)       {           if(isupper(*string))               *string=tolower(*string);           string++;       }       *string='\0';       return 0;   }   /*char *strlower(char *string)  {      char    *s;                if (string == NULL) {          return NULL;      }        s = string;     while (*s) {          if (isupper(*s)) {              *s = (char) tolower(*s);          }          s++;      }      *s = '\0';     return string;  }  */      void main()   {       char *test="ABCDEFGhijklmN";    //定义了一个字符串常量,不可以改变…………………………     strlower(test);       cout<
    <

     

转载于:https://www.cnblogs.com/renyuan/archive/2012/12/18/2823087.html

你可能感兴趣的文章
pycharm远程服务器进行调试
查看>>
linux下 如何切换到root用户
查看>>
Python中的json操作
查看>>
数据结构之排序算法二
查看>>
Mysql数据库索引的使用
查看>>
【推荐系统篇】--推荐系统之训练模型
查看>>
Mysql篇--Linux中安装Mysql
查看>>
CSS3实现图片木桶布局
查看>>
Flask入门之Virtualvenv的安装及使用(windows)
查看>>
Coder-Strike 2014 - Finals (online edition, Div. 2) B. Start Up
查看>>
(转载)软件开发模式对比(瀑布、迭代、螺旋、敏捷)
查看>>
eclipse中AndroidA工程依赖B工程设置
查看>>
Oracle - 查询
查看>>
SVN入门教程
查看>>
angular2
查看>>
24点游戏 程序(二)
查看>>
linux ----> centos 网络、tomcat、vi、等等的配置和使用
查看>>
Hive导入数据
查看>>
【剑指offer】数值的整数次方
查看>>
CentOS 7 系统服务详解
查看>>