·字符串
一、字符串的一些特点
1.从ANSI C标准起,如果字符串面量之间没有间隔,或者用空白字符分隔,C会将其视为串联起来的字符串面量。
char greeting[50] = "Hello,and""how are""you""today!";
//等价于
char greeting[50]="Hello,and how are you today!";
2.如果要在字符串内部使用双引号,必须在双引号前面加上一个反斜杠()
printf("\"Run ,Spot, run!\"exclaimed Dick.\n")
//输出如下
"Run , Spot, run!"exclaimed Dick.
3.字符串属于静态存储类别,这说明说如在函数中使用字符串常量,该字符串只会被储存一次,在整个程序的生命期内存在,即使函数被调用多次。用双引号括起来的内容被视为指向该字符串储存位置的指针。这类似于把数组名作为指向该数组位置的指针。
//把字符串看成指针
#include<stdio.h>
int main(void)
{
printf("%s,%p,%c\n","We""are"*"space farers");
return 0;
}
//输出
//We, 0x100000f61, s 其中0x100000f61是a的地址
注:字符数组名和其他数组名一样,是该数组首元素的地址。
char car[0] = "Tata";
//那么
car == &[0]
*car == 'T'
*(car+1) == car[1] == 'a'
二、字符串数组和初始化
定义字符串数组时,必须让编译器知道需要多少空间。
1.用足够空间的数组储存字符串
const char m1[40] = "Limit yourself to one line's worth.";
//const表明不会更改这个字符串
//下面是标准的数组初始化形式
const char m1[40] = {""L","i","m",""""""""""",".","\0"";}
//注意最后的空字符串,没有这个空字符,这就不是一个字符串,而是一个字符数组。
注:在指定数组大小时,要确保数组的元素个数至少要比字符串是长度多一(为了容纳空字符)
所有未被使用的元素被自动初始化为0(这里的0指的是char形式的空字符,不是数字字符0)
2.让编译器确定数组的大小
const char m2[] = "If you can't think of anything, fake it.";
注:让编译器计算数组的大小只能用在初始化数组时,如果创建一个稍后再填充的数组,就必须在声明时指定大小。
声明数组时,数组大小必须是可求值的整数。在C99新增变长数组之前,数组的大小必须是整型常量,包括由整数常量组成的表达式。
int n = 8;
char cookies[1]; //有效
char cakes[2 + 5]; //有效,数组大小是整型常量表达式
char pies[2*sizeof(long double) + 1];//有效
char crumbs[n]; //C99标准之前无效,C99之后这种数组是变长数组
补:还可以用指针表示法创建字符串
const char * pt1 = "Something is pointing at me"
//该声明与下面的声明几乎相同(不是完全相同)
const char ar1[] = "Something is pointing at me.";
标签:初始化,const,car,char,数组,字符串
From: https://www.cnblogs.com/lttlmylove/p/17879811.html