一、字符串
字符串:储存在双引号中,并且结尾是空字符\0的才算字符串,空字符\0是编译器自动加的,不需要人为加。
字符串本身也表示一个地址,这个地址是字符串首字符的地址,可以根据下面的程序来验证:
//验证字符串本身的地址
#include <stdio.h>
int main(void)
{
char *ptchar="I love Rick!";
printf("print the adress of ptchar :%p\n",ptchar);//names是一个指针,储存的是首字符的地址
printf("print the adress of the characters :%p\n","I love Rick!");//表示的是首字符的地址
printf("print the adress of names+1 :%p\n",ptchar+1);//表示的是第二个字符的地址
printf("print the adress of characters+1 :%p\n","I love Rick!"+1);//表示的是字符串第二个字符的地址
return 0;
}
打印结果:
print the adress of ptchar :0000000000404000 print the adress of the characters :0000000000404000 print the adress of names+1 :0000000000404001 print the adress of characters+1 :0000000000404001
*在printf()、puts()、fputs()函数中,只要知道字符串的首字符的地址,就可以根据%s转换说明打印出这个完整的字符串。
另外:字符串宏代表的也是字符串首字符的地址。
例如:
//利用地址在输出函数中打印出完整的字符串
#include <stdio.h>
#define BBC "love"
int main(void)
{
char names[]="I love Rocky!";
char *ptchar="A handsome man!";
printf("print the characters :%s\n",names);
printf("print the characters :%s\n",BBC);
printf("print the characters :%s\n","love");
printf("print the characters :%s\n",ptchar);
puts(names);
puts(BBC);
puts("love");
puts(ptchar);
fputs(names,stdout);
fputs(BBC,stdout);
fputs("love",stdout);
fputs(ptchar,stdout);
return 0;
}
打印结果如下:
print the characters :I love Rocky! print the characters :love print the characters :love print the characters :A handsome man! I love Rocky! love love A handsome man! I love Rocky!loveloveA handsome man!
二、字符串常量(字符串宏)
使用#define声明的字符串,我们叫做字符串常量。(也叫字符串宏)
三、指针声明字符串
什么是指针声明字符串:就是用指针来声明一个字符串。
例如:char *ptchar="I love opening the door."就叫用指针声明一个字符串。
从本质上来理解为什么使用指针来声明字符串:
首先:I love opening the door.是一个字符串,计算机首先会为他寻找一个内存,存储在程序中。
其次:这个指针ptchar储存的是字符串中首字符的地址,知道字符串的首地址了,那么我们就可以根据这个地址在内存中找到这个字符串。这样做相比于创建数组而言,可以直接访问原始数据的地址。
例如:
//测试2
#include <stdio.h>
int main(void)
{
char *ptchar="ABCDEFG";//指针声明字符串
printf("打印指针所储存的地址:%p\n",ptchar);
printf("打印字符串首字符的地址:%p\n","ABCDEFG");
return 0;
}
打印内容如下:
打印数组首元素的地址:0000000000404000 打印字符串首字符的地址:0000000000404000
四、字符串数组(一维)
字符串数组和其他数组一样,只不过,字符串数组的初始化要用双引号。
*重点内容:一维数组的数组名称就是一个指针,这个指针储存的内容是字符串首字符的地址。
初始化的本质:例如: char names[20]="I love Rick very much."这个字符串数组
首先:计算机会给I love Rick very much.这个字符串一个内存,这个字符串储存在了程序中。
创建了names[20]这个数组,计算机会分给这个数组一个内存,数组中的20个元素也储存在程序中。
其次:计算机再将这个字符串复制一份,放入这个字符串数组中,没有储存字符的元素将被初始化为空字符\0。
如果对数组初始化:那么不必知道这个数组的大小,计算机会按照字符串的大小自动为数组分配大小,如果字符串中由n个字符,1个空字符,那么数组的大小就是n+1。
如果不对数组进行初始化:那么数组必须要有大小。
//测试
#include <stdio.h>
int main(void)
{
char dates[20];//首先,必须声明这个数组中元素的个数
fgets(dates,15,stdin);//stdin表示输入的内容是储存在输入缓存流中的 ,然后直接保存在数组中。
fputs(dates,stdout);
char times[20]="ABCDEFG";
printf("打印数组首元素的地址:%p\n",times);
printf("打印字符串首字符的地址:%p\n","ABCDEFG");
return 0;
}
打印结果如下:
hhhjhjhjuu hhhjhjhjuu 打印数组首元素的地址:000000000062FDE0 打印字符串首字符的地址:000000000040401A
五、字符串数组(二维)
二维字符串数组是由多个一维字符串数组组成的。
例如:char names[4] [20];
表示的是是由4个一维字符串数组组成的,每个一维字符串数组最大可以容纳20个字符。
names是二维字符串数组的名称,这是一个指向一维字符串数组的指针,储存的是第一个一维字符串的地址。
names[0]是一维字符串的名称,这是一个指向字符的指针,储存的是第一个一维字符串数组中首字符的地址。