C语言字符串定义

来源:互联网 发布:数据无法求和 编辑:程序博客网 时间:2024/04/29 03:39
 #include <stdio.h> #include<stdlib.h>int main(){   char *s = "abcde";   char s1[] = "ffffff";   //*s = *s1; //错误,s指向的字符串是存放在不可以更改的内存区域,更改s指向单元的任何数据都是不允许的。      s++;  // s1++;//错误,表达式必须是可修改的左值  // s1 = s1 +2;   printf("%s\n",s);//输出结果为  bcde   printf("%s\n",s1);   printf("%s\n",s1+2);//输出结果为 ffff   getchar();   return 0;}


char *s = "abcde",说明申请的空间的内容是不能更改的,可以改为 char s[ ];

因为s指向的字符串是存放在不可以更改的内存区域,更改s指向单元的任何数据都是不允许的。所以*s = *s1是重写s所指单元,故出现错误。数组是可以的,因为它不是存放在不可以更改的内存区域。

但为何指针指向的字符串常量不可更改,而用字符串常量初始化的数组就可以更改?

因为写编译器的人规定了指针指向的字符串常量是存放在不可以更改的内存区域的。编译器的游戏规则是这样的。数组没有这么样的规则。



转自:

点击打开链接

在C中定义字符串有下列几种形式:字符串常量,char数组,char指针

1.字符串常量

        即:位于一对双括号中的任何字符。双引号里的字符加上编译器自动提供的结束标志\0字符,作为一个字符串存储在内存中。如:printf("%s","hello"); //"hello"
       如果字符串文字中间没有间隔或间隔的是空格符,ANSI  C 会将其串联起来。例:
         char greeting[50] = "hello,and" "how are" "you";
       等价于:
         char greeting[50] = "hello,and how are you";
       字符串常量属于静态存储类。静态存储是指如果在一个函数中使用字符串常量,即使是多次调用了这个函数,该字符串在程序的整个运行过程中只存储一份。整个引号的内 容作为指向该字符串存储位置的指针。这一点与把数组名作为指向数组存储位置的指针类似。

2.字符串数组及其初始化

       初始化例子:
       char m[40] = "hello,world";  //定义字符串数组时必须指定数组大小(整型常量),在指定大小时,要确保数组的大小比预定的大一个,因为编译器会自动添加'\0'。
                                                        //多余的元素会初始化为'\0'
       char m={'h','e','l','\0'};  //注意标志结束的空字符,若没有它,得到的只是一个字符数组而不是字符串

3.利用char指针定义字符串


       char *m = "hello,world"; //自动添加'\0'
       注意:此时字符串指针m指向字符串常量,不成用*(m+1)='o'修改此常量,因为这个字符串常量放在常量区不能被修改

4.数组和指针

       数组形式和指针形式有什么不同呢?
       数组形式: char m[40] = "hello,world";
       指针形式: char *m = "hello,world";

   数组形式:

         编译器会把数组名m看作是数组首元素的地址&m[0]的同义词,m是个地址常量。可以用m+1来标识数组里的下一个元素,但不能使用++m,增量运算符只能在变量前使用, 而不能在常量前使用。
         m[40]在计算机内存中被分配一个有40个元素的数组(其中每个元素对应一个字符,还有一个附加的元素对应结束的空字符'\0')。每个元素都被初始化为相应的字符。  
        通常,被引用的字符串存储在可执行文件的数据段部分;当程序被加载到内存中时,字符串也被加载到内存中,把被引用的字符串复制到数组中

    指针形式:

         指针形式(*m)也会在静态存储区为字符串预留空间。此外,一旦程序开始执行,还要为指针变量m另外预留一个存储位置,以在该指针变量中能够存储字符串的地址。
          m指向字符串的第一个字符,可用++m指向第二个字符。  指针m是个变量。   


如果我们用动态申请的方法给一个字符串赋值,那么该字符串在程序运行过程中的值依然可以修改。

#include<stdio.h>#include<stdlib.h>int main(){  int a,b;  char *c = "akbiee";  char *m = (char*)malloc(sizeof(char)*6);  while(*c)    *m++ = *c++;  *m = '\0';  m = m-6;  *(m+2) = 'w';//正确,可以修改  //*(c+2) = 'f';//错误,不能修改  printf("%s\n",m);  system("pause");  return 0; }


原创粉丝点击