字符串
字符串是由字符数组构成的并且以\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 <stdio.h>
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<str2返回值小于0;
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<stdio.h>
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 <stdio.h>//系统头文件用<>
#include "hello.h"//自定义的头文件用“”
#include <stdio.h>
#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 这几个指令称为条件编译指令,可对程序源代码的各部分有选择的进行编译。