数据类型
sizeof() 单位是字节 byte
计算机中的单位:
bit - 比特位 最小单位 - 存放一个二进制
byt - 字节 = 8bit
kb - 1024 byte
mb - gb -tb - pb
为什么整形 int 与长整形 long 都是4字节
C语言标准: sizeof(long) >= sizeof(int)
2022/11/18
常量
1.字面常量
3.14,10 等等
2. const 修饰的为常变量
const 修饰后的常变量不可改变属性,例如:
const int a = 10;
a = 20; //error 此时编译,a 会进行报错。
常 但依旧是变量
int n = 10;
int arr[n] = {0}; // 不行,n为变量
const int n = 10;
int arr[n] = {0}; // 不行,n为常 但依旧是变量
3. define 定义的常量
define 不是关键词,是编译器实现的,用来定义宏的预处理指令
4. 枚举变量:用于可以 一一列举 的例子
关键词: enum 使用:
enum name
{
a,
b,
c,
}
enum name X = a;
字符串与转义字符
字符串
“字符串的”结束标志是一个“ \0 ” 的转义字符,且 \0 不算字符串内容
字符数组:一组相同类型的元数
如: char arr[] = "hello"; //[]内不赋值,系统自动赋值
此处 arr[]内的[] 为6 ,第六个为 \0
char arr1[] = "abc"; //arr1[4]
char arr2[] = {'a','b','c'}; //arr2[3] ,无 \0
arr2在此处添加一个'\0' ,则与arr1输出相同
/*
#include <string.h>
strlen(arr1) ——> 求长度的函数 ——>输出 3 ,
可知 “ \0 ” 不计入字符串长度
strlen(arr2) ——> 输出随机值,因为无结束符
sizeof(arr1) ——> 会计算 \0
*/
字符串之间比较,不能使用 == 。
应该使用 strcmp(字符串1,字符串2)
相等,返回0;
字符串1 < 字符串2 返回<0
字符串1 > 字符串2 返回>0
转义符
注意:
printf("%s\n", " \\ \""); //输出 \" 此处的 \\ 转义了转义
好玩的:\a 警告字符,蜂鸣
重要的:\ddd 打印ASCII
ddd表示 1~3 个八进制的数字 如 \130 输出 X
\xdd
dd表示2个十六进制数字 如:\x30 输出 0
面试题 //程序输出什么
printf("%d\n","c:\test\328\test.c")); //12
// 八进制中不存在8。 存在的转义 \t \32 \t
printf("%s\n", "c:\test\328\test.c");
注释
// C++的注释
/**/ C的注释 C注释不支持嵌套注释
操作符
位移操作符:》《 移动的是二进制位
int a = 2; //a : 0010;
int b = a<<1; //b : 0100;
printf("%d\n",b); //b : 4
位操作符:& 按位与 |按位或 ^按位异或
sizeof 是操作符!
按位取反
int a = 0;// int 4位,32个bit
//0按位取反后为 32个1,但是最高位1是负数。
printf("%d\n",~a); //输出 -1
原码取反+1 得到补码 正数:原码补码反码 相同
负数 : -1 :
10000000 00000000 00000000 00000001 (原码)
11111111 11111111 11111111 11111110 (反码)
11111111 11111111 11111111 11111111 (补码)
类型(强制转换)
int a = (int)3.14; ——不推荐
条件操作符 exp1?exp2:exp3
exp1 成立,exp2计算,整个表达式的结果是 exp2的结果
exp1 不成立,exp3计算,整个表达式的结果是 exp3的结果
max = a>b?a:b;
常见关键字
1. C语言提供的,不可自己创造的
2. 关键字不能作为变量名字
register int num = 100;//建议放在寄存器中
//register 大量频繁使用的数据,可以放在寄存器中,提升效率
关键关键字
typedef 类型重定义
typedef unsigned int u_int;
static - 静态的
1. static 修饰局部变量
2. static 修饰全局变量
3. static 修饰函数
1. void test_1() void test_2()
{ {
int a = 1; static int a = 1;
a++; a++;
printf("%d ",a); printf("%d ",a);
} }
test_1 输出全是2 test_2 输出 2~11
static 修饰局部变量,使 a 不销毁,改变了变量的生命周期
本质是: 改变了变量的存储类型
栈区:存储局部变量、函数的参数
堆区:动态内存分配的
静态区:存放全局变量和 static 修饰的静态变量
2. static 修饰的全局变量限制在自己所在的源文件内可以使用
全局变量,在其他源文件内部可以被使用,是因为全局变量具有
外部连接属性,但是被 static 修饰后则变成了内部连接属性。
3. static 修饰函数 与 修饰全局变量 相似
#define 定义常量和宏
define 预处理, 本质是替换。
#define ADD(X+Y) X+Y
printf("%d\n", 4*ADD(2,3)); //输出 11 并非20.
//若需要输出为20 则需要如此修改 #define ADD(X+Y) ((X)+(Y))
2022/11/19
指针 —— 就是 地址
思考:1.内存如何编号?2.一个这样的内存单元多大空间
1. 32位 - 32跟地址线 - 物理线 - 1/0
电信号转换成数字信息:1和0组成的二进制序列
————32跟地址线上产生的所有二进制可能性,任意一个而金子则为内存编号
2. 2^32次方个内存单元 - 每个内存单元的大小是1个字节(Byte)
%p 打印地址 int* pa = &a; //pa是用来存放地址的,在C语言中,pa叫指针变量
// * 说明 pa 是指针变量
// int 说明 pa 执行的对象是 int 类型
*pa = 20; // *解引用操作 *pa通过pa里面的地址,找到a
指针变量大小
指针大小相同。
结构体
让C语言创建出新的类型:例如创建一个学生类型
struct Stu
{
char name[20]; //成员变量
int age;
double score;
};
struct Stu s = {"张三",20,85.5}; //结构体的创建和初始化
printf("1:%s %d %lf\n",s.name,s.age,s.socre); //结构体变量.成员变量
struct Stu * ps = &s; //测试
printf("2:%s %d %lf\n",(*ps).name,(*ps).age,(*ps).socre);
printf("3:%s %d %lf\n",ps->name,ps->age,ps->socre);// 结构体指针->成员变量名