字符串
字符串是由字符数组构成的并且以\0作为结束符字符串用双引号引起来;
字符数组与字符串的区别
字符数组不需要以\0结尾,
字符串的初始化
1.最复杂的方式
char b[]={'h','e','l','l','o','\0'};
以字符数组的形式,一个字符一个字符的初始化
2.相对简单的方式 (用双引号引起来的字符串来初始化一个数组)
char c[11]="Good Day1";
用一个字符串来初始化一个字符数组,或则char c[]="Good Day1”;省略下标
直接用双引号引起来的字符串叫做常量字符串,赋值过程,将常量字符串的内容拷贝到字符数组中
3.另外一种初始化方式 (用指针指向一个字符串)
char *pstr="Good Day!";
把一个字符串赋值个一个字符指针,则这个指针指向字符串的首元素,且这样的字符串是一个字符串常量,即“Good day!”,存储在常量区,其内容不能被修改,等价于const char * pstr=“GoodDay!”
字符串的三种存储方式
1.栈区,字符串的内容可以被修改
char a[]={'h','e','l','l','o','\0'};
a[0]='H';
2.常量区,字符串的内容不可以被改变
char *c="hello";
printf("%s\n",c);
3.堆区,使用malloc函数在堆区开辟一块空间,再将字符串存入,字符串的内容可以被改变
char *d=(char *)malloc(6);
d[0]='h';
d[1]='e';
d[2]='l';
d[3]='l';
d[4]='o';
d[5]='\0';
free(d);
charb[]={'h','e','l','l','o','\0'};//'\0\'是字符串的结束符,如果没有\0就是字符数组就不是字符串字符串的本质也是字符数组
printf("%s\n",b);//用%s打印,逗号后边是字符串的地址
//%s从字符串的第一个字符开始一直打印到\0结束符结束。
printf("%s\n",a);
for (int i=0; i<5;i++) {
printf("%c\t",a[i]);//字符数组只能挨个打印
}
#include
int main(){
//1.一个字符一个字符的初始化字符串,最后一个字符是\0;
char a[]={'h','e','l','l','o','\0'};
//2.
char b[]="hello";//直接用上引号引起来的字符串叫做常量字符串,赋值过程:将常量字符串的内容拷贝到字符数组中。
//3.用指针指向一个字符串。
char *c="hello";//栈上的指针保存常量区字符串的首地址。
//c[0]='H‘,指向常量的的字符串所以字符串的值不能修改。
return 0;
strcpy char *strcpy(char *to, const char *from);字符串的拷贝
//strcpy(d, b);不能往常量区拷贝
//注意的问题 1.空间要足够大
strcmp (str1,str2) st1>str2返回值大于0;
str1 str1=str2 返回值等于0 char *a="hello"; char *b="Hellow world"; //字符串比较大小:从两个字符串的第一个字符一个字符一个字符的比较asc码;直到两个字符不一样就可以比较出字符串的大小 int n=strcmp(a,b);//strcmp函数的返回值有三种。大于零,小于零,等于零。 //求字符串的长度不包括\0的位置 //直到什么时候就怎么样的时候用while,这样可能是最简单的 //写程序时尽可能将问题模块儿化,划分成简单的问题 类型重定义 给已经存在的类型重新起一个名字 typedef 称为类型重定义或类型重命名; 结构体:指的是一种数据结构,它用于表示有关联的元素; 数组:相同类型的值的集合。 结构体:有关联的元素的集合。 定义结构体的三种形式 ① 先定义结构体,再声明结构体变量; ② 定义结构体的同时声明结构体变量 ③ 类型重定义 可以类比枚举,格式都是一样的。 int main(){ STUDENT s1; //如果声明的时候没有初始化,只能再一个一个初始化。 STUDENT s2={12,"ni","sb"}; STUDENT s3={16,"wo","shijie"}; //字符数组 进行单个初始化的时候只能进行 拷贝; s1.stuId=19; strcpy(s1.name, "doubi"); strcpy(s1.address, "henan"); STUDENT *m=&s1; printf("%s%s\n",s1.name,s1.address); //结构体变量用.访问 printf("%s%s\n",m->name,m->address); //结构体指针用->访问 return 0; } m->name 等价于(*m).name 计算结构体的大小两条规则 一、 结构体中的从第二个成员开始,按自身字节数补齐(把其那边的内存补齐成自身字节数的倍数,有0补齐) 二、 结构体最终的大小是结构体成员中最大字节数的倍数 #include typedef struct { int a; double b; char c; short d; char f; }STR; typedef struct{ double a; char b; int c; short d; }STR1; int main(){ printf("%ld\n",sizeof(STR));//24 printf("%ld\n",sizeof(STR1));//24 } //包含头文件,将头文件中的内容拷贝到当前位置 //头文件中是函数的声明,源文件中是函数的实现 #include #include "hello.h"//自定义的头文件用“” #include #define PI 3.14159//宏定义(宏替换)单纯的替换掉文本中的文本内容 宏定义不要带分号,标识符一般大写 #define add(x,y) x+y //宏定义不分配内存,变量定义分配内存 预处理不做语法检查 #define mul(x,y) (x)*(y)//带参数的宏 int main(){ printf("%f\n",PI); printf("%d\n",add(1,2)); printf("%d\n",mul(1+2, 3+5)); return 0; } #if #elif #else #endif 这几个指令称为条件编译指令,可对程序源代码的各部分有选择的进行编译。