1、字符串常量
字符串常量是由双引号,引起的一串字符。
系统在字符串常量最后添加一个字符'\0'。
故字符串大小会比实际字面量要多一个,包括'\0'。
字符串长度用strlen,不包括'\0'。
字符串存储在数据段,且是只读数据段。
①将其处理一个指向data段这段字符串的首地址。
②C语言将常量字符串,处理为一个指向数据段中一段字符串的字符指针或理解为常量字符数组。
对比数组,三要素,起始地址,步长,范围
//char* 能不能代表了整个字符串?可以代表整个字符串。 起始地址:将其处理一个指向data段这段字符串的首地址。步长:char。范围:'\0'
char *p = "china";
printf("p = %p p+1 = %p p[0] = %c 0[p] = %c\n", p, p+1, p[0], 2[p]);
printf(" = %p +1 = %p = %c = %c\n", "china", "china"+1, "china"[0], 2["china"]);
(1)常量字符串不可更开,因为其存储在数据段的只读数据段。
(2)正是因为字符数组和字符串,他们具有相同的性质,并不代表字符串可以与任意的字符数组之间划等号。
所以为了要改变字符串的内容,通常将常量字符串拷贝到字符数组中去。
char arr[6] = "china";
//arr[6]是栈上的空间, "china"是data 一块常量区域
(3)字符数组与字符串等价情况
等价:sizeof(字符数组)的大小 ≥ sizeof(字符串)的大小
不等价 :sizeof(字符数组)的大小 ≤ sizeof(字符串)的大小,字符数组此时只是字符数组而已。
一个没有’\0’结尾的字符串 不能称为一个合格的字符串 。
(4)小结:
char *p = "china"; //将指针赋给了p
char arr[] = "china"; //将指针指向的内容赋给了arr
(1)输入:printf(“%s”);
特点:遇到字符串结束标记则会停止打印输出。
int puts(const char *_Str); puts自动追加换行。
(2)输出:scanf,遇到空格会截止输入。
但是要记得,不要输入的字符长度超过给定的空间大小。
gets直到遇到回车,才停止输入, 空格也作为字符输入。
①把一类功能的函数写到一个xxx.c中
②把xxx.c中所有的函数声明写到xxx.h中
③在xxx.h中加入避免头文件重复包含的语句
#ifndef __MYSTR_H__
#define __MYSTR_H__
#endif
④将xxx.h包含到xxx.c中去,自包含,自实现的用""
⑤在main函数中包含xxx.h,谁用谁包含
注解:(1)实现 (2)声明
(3)把一做成库,libmystr.so,给别人提供mystring.h就可以了
(1)指针数组与数组指针的本质
指针数组的本质是数组, 数组指针的本质是指针。
int arr[] = {1,2,3,4,5}; //整型数组
char cARR[] = {a,b,c,d,e}; //字符数组
char aa,bb,cc,dd;
char* apArr[] = {&aa,&bb,&cc,&dd}; //字符指针数组
char *pa = "china", *pb = "america", *pc = "canada", *pd = "Japan";
char* cpArr[] = {pa, pb, pc, pd}; //字符指针数组
char* cpArr[] = {"china", "america", "canada", "Japan"}; //字符指针数组
在启动进程,通过命令行,传递给进程的参数,即传递main的参数
//arg argument 参数 c count 个数 argc 参数的个数
//argv argument 指针数组 v vector 向量 指针数组向量
int main(int argc, char *argv[])
{
}
参考资料:《零基础入门C语言--王桂林》