字符串
c语言规定使用\0字符表示字符串结尾 \0表示空字符
字符串是一个特殊的字符数组 就是数组的最后面多了一个\0字符
其他语言的字符串实现也c语言的实现没有大的区别
但是它们不一定使用\0来作为结尾
字符串两种表示方式
1.char buf[]={'a','b','c','\0'}
2."abc" 使用""的时候会自动在末尾添加\0字符
指针变量的空间大小
内存是由一个一个字节组合而成但是内存整体分为不同的功能的存储区域
所有类型的指针变量占用的内存空间大小都是一样的 每个指针变量占用字节数的大小是根据不同的机器而不同的
在32位机器(不是操作系统位数)中所有的指针变量都是4个字节
在64位机器(不是操作系统位数)中所有的指针变量都是8个字节
char *p ="hello world"
1.内存先在常量区开辟一块空间来存放hello world
2.把字符h的指针地址存放的p变量中
字符串声明的两种方式
1.一种放在内存的变量区
2.一种放在内存的常量区 常量区的内容一旦被初始化后便不能再被修改
格式化输出函数
输出步骤
数 》 字符类型编码格式 》 显示器把编码转换成对应图形字符
数字10和字符串10的显示原理
1.数字10 的编码为 1010
2.字符串10的编码为 00110001 00110000
字符串10由ASCII码表中的1的编码和0的编码组合而成
任何类型的数需要打印输出的时候都必须先转换成字符串类型
只有先转换成字符串才能在屏幕输出对应的图形字符
显示器只能按照单个字符图形来进行显示 比如要显示数字10
在显示器上其实是字符1和字符0的组合显示 而不能直接显示数字10
float b = 100 / 120
b不等于1.2 而是等于1.0
如果表达式中的操作数类型是一致的 那么表达式运算的结果的类型也会和操作数类型一致
所以会把100 /120 的1.2强制转换成整型变成了1
把数字1变成字符'1'
int a=1;
char b=a+'0'
计算机不能直接存储字符'0'而是存储的是字符'0'的编码数字48
48+1=49 编码数字49表示的是字符'1'的编码
把字符1变成数字1
char a='1' 字符1的编码是49
int b=a-'0'=49-48=1
char类型其实是一个特殊的整型数据 存储的是ascii的整型数字
所以字符和字符或者字符和int数据可以直接进行加减操作 得到的是一个整数类型的值
字符和字符串在计算机内部存储的时候已经就是字符编码的形式了 所以在输出显示的
时候无需再次转换成字符编码
其他类型的数据在输出显示的时候就必须要先转换成字符编码才行
键盘上的任意按键都是字符图形 计算机不能直接存储这些字符图形 这些字符图形都
有一个对应的编码数字 计算机内部存储的都是这些编码
在输入和输出的时候都有一个把字符图形转换成编码数字的过程
c语言结构体
批量定义不同类型变量的属性集合 和数组不同的是 数组只能存储同一类型变量的集合
结构体是一个类型 就好像是int float
结构体的总字节数 >= 各个成员字节数的总和
struct student
{
char name[20];
char gender;
unsigned num;
float score;
};
int main(void)
//c语言中的""表示字符串 ''表示字符 两者不能交换写
struct student stu = {"zhangsan",'M',1234,75.8};
printf("stu name: %s\n", stu.name);
printf("stu gender: %c\n ", stu.gender);
return 0;
}
View Code
指针访问结构体变量
结构体变量的第一个字节的地址 就是整个结构体变量的指针
结构体变量的第一个字节 也是结构体第一个元素的第一个字节地址
变量名访问 stu.name
指针访问 (*pstu).name 或者 pstu->name
传递整个结构体变量
实际上就是开辟一个与实参结构体变量同等空间大小的形参变量
然后将实参结构体变量中的所有内容全部拷贝到形参结构体中
这种参数的传递方式效率并不高
修改形参变量的结构体时候并不会影响到实参结构体的数据
结构体数组
int arr[5];
struct student stus[5];