c语言学习笔记-11.30字符串和字符串函数

1.1.1在程序中定义字符串

1.字符串字面量(字符串常量)

用双引号括起来的内容被称为字符串常量,也叫做字符串字面量。

如果字符串字面量之间没有间隔,或者用空白字符分隔,c会将其视为串联起来的字符串字面量。

如果要在字符串内部使用双引号,必须在双引号前面加上一个反斜杠(\)

 

字符串常量属于静态存储类别

用双引号括起来的内容被视为指向该字符串存储位置的指针。这类似于把数组名作为指向该数组位置的指针。

 

printf("%s,%p,%c","we","are",*"friends")

 

会显示we,0x100000f61,f

*"friends"表示该字符串所指向地址上存储的值,应该是字符串的首字符。

 

2.字符串常量数组和初始化

省略数组初始化声明中的大小,编译器会自动计算数组的大小

如果创建一个稍后再补充的数组,就必须在声明时指定大小

 

3.数组和指针

字符串存储在静态存储区。程序开始运行时才会为该数组分配内存。此时,才将该字符串拷贝到数组中。注意,此时字符串有两个副本。一个是在静态内存中的字符串字面量,另一个是存储在数组中的字符串。

const char * pt1="something is pointing at me"

const ar1[]="something is pointing at me"

以上两个声明表明,pt1和ar1都是该字符串的地址。在这两种情况下,带双引号的字符串本身决定了预留给字符串的存储空间。尽管如此,这两种形式并不完全相同。

 

数组:

在数组形式中,ar1是地址常量。不能更改ar1,如果改变了ar1,则意味着改变了数组的存储位置(即地址)。可以进行类似ar1+1这样的操作,标识数组的下一个元素。但是不允许进行++ar1这样的操作。递增运算符只能用于变量名前(或概括地说,只能用于可修改的左值),不能用于常量。

指针:

在指针形式中,编译器为字符串在静态存储区预留n个元素的空间。另外,开始执行程序时,它会为指针变量pt1留出一个存储位置,并把字符串的地址存储在指针变量中。该变量最初指向该字符串的首字符,但是它的值可以改变。因此,可以使用递增运算符。

 

字符串字面量被视为const数据。由于pt1指向这个const数据,所以应该把pt1声明为指向const数据的指针。这意味着不能用pt1改变它指向的数据,但是仍然可以改变pt1的值(即,地址)。

总之,初始化数组把静态存储区的字符串拷贝到数组中,而初始化指针只把字符串的地址拷贝给指针。

 

4.数组和指针的区别

数组名是常量,指针是变量

数组获得的是原始字符串的副本

总之,如果打算修改字符串,就不要用指针指向字符串字面量。

 

5.字符串数组

const char * a[3]={"blue","green","red"};

char b[3][10]={"blue","green","red"};

从某些方面看,两者非常相似。两者都代表3个字符串。使用一个下标时都分别表示一个字符串;使用两个下标时都分别表示一个字符。

两者的初始化方式也相同

 

但是,它们也有区别

a数组是一个内含3个指针的数组,在我们的系统中占24个字节。

而b是一个内含3个数组的数组,每个数组内含10个char类型的值,共占用30个字节。

 

所以,虽然a[0]和b[0]都表示一个字符串,但a和b的类型并不相同。a中的指针指向初始化时所用的字符串字面量的位置,这些字符串字面量被存储在静态内存中;而b中的数组则存储着字符串字面量的副本,所以每个字符串都被存储了两次。此外,为字符串数组分配内存的使用率较低。b中的每个元素的大小必须相同,而且必须是能存储最长字符串的大小。

 

综上所述,如果要用数组表示一系列待显示的字符串,请使用指针数组,因为它比二维字符数组的效率高,但是指针数组也有自身的缺点。a中的指针指向的字符串字面量不能更改;而b中的内容可以更改。所以,如果要改变字符串或为字符串输入预留空间,不要使用指向字符串字面量的指针。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值