字符串及字符串数组

一、字符串

字符串:储存在双引号中,并且结尾是空字符\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]是一维字符串的名称,这是一个指向字符的指针,储存的是第一个一维字符串数组中首字符的地址。

 

上一篇:Python基础语法一(转载)


下一篇:java 线程一 Thread类补充知识