【C语言·字符串】关于字符串的存储问题

来源:互联网 发布:dedecms tag 数据库 编辑:程序博客网 时间:2024/05/16 08:17

前言:

字符串学习过去已经很久了,明显遗忘了很多,最近通过看书、查阅资料、记笔记博客的形式来复习一下,希望能有所提高。


1)字符串有两种存储方式:一个是数组存储,一个是指针存储。

2)数组与指针的说明:数组可以看作指针,在C语言程序时,数组先转换为指针,得到数据的地址,然后再进行有关操作;但值得注意的是,数组名是一个不可变的指针,它不能进行自增之类的运算来改变数组名这个指针的指向。

3)数组存储方式:

①.直接定义数组大小:char arr[100]="Hello World!"

②.不去定义数组大小: char[]="Hello World!"

③.其实这两种都是可行的,第二种由实际字符串来决定数组的大小,所以,一般来讲如果不打算修改字符串内容,可以使用②,但如果打算修改字符串内容,建议①。

4)指针存储方式:

char *p="Hello world!"

①.该指针指向字符串中第一位的地址,根据指针的运算,可以有*p=='H',*++p='e',可以灵活运用。

②.若使用指针存储的方式存储存储字符串,那么要修改字符串的内容是值得注意的事情,因为:如,p[1]='1',这种语句可能会导致内存访问错误,原因呢在于编译器可能选择内存中的同一个单个的拷贝,来表示所有相同的字符串文字。这样就意味着可能你想改单独的一个字符串的单个字符,结果修改了所有相同的字符串的单个字符,这是值得注意的。

③.解决②中的方法一是可以用数组来存储字符串,这样就可以指明到底是那个字符串;二是在定义时使用const修饰符,来避免被②过程修改,其实,在单纯的像例句那样,编译器会给出警告,而使用const修饰符则不会出现警告。

5)使用字符串指针数组来定义多个字符串:

const char *arr[3]={"hello","name","what"};

   要知道这并不是二维数组,而是指针数组,数组中的每一个元素作为指针都指向字符串的开头,即*arr[0]='h',*arr[1]='n',*arr[2]=w,*(arr[0]+2)='l',明白这数组是关于指针而不是关于字符串的。

6)总结:

①若打算要修改字符串内容或者建立一个存储字符串的内存区域,那么建议使用字符串数组,如果想存储字符串常量,那么可以直接用 const char *p="xxxx"。

②利用p=name来可以使用指针来指定原本不可变的name的指针,当然可以使用name[i]这种来指明,对于这两种方式都要学会灵活运用。

原创粉丝点击