/*
上局还有一点没讲,就是野指针,空指针
举一个例子:医生和病人,医生指向(指针)病人(地址),医生指一号病人,二号病人这就是指针;假如3号病人有事走了(地址还给操作系统),医生还指3号病人,这就是野指针
你完全不知道计算机给3号病人的位置放置了什么地址,万一是病毒呢?
所以当你创建了指针,但还没确定指向时,一定要指向空(医生在没有病人的情况下,就不要乱指人看病),这就是空指针;
*/
#include<stdio.h>
int main()
{
int* point = NULL;//指向空指针
return 0;
}
/*-------------------------------------------------
补充几点对线小知识
运算符,前面已经讲到算术运算符 + - * / %
下面讲一下位运算符 << >>
*/
左移运算符:
讲解:
右移运算符:
#include<stdio.h>
int main()
{
int number = 2;
int Number_two = number >> 1;//二进制右移运算符。将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。
printf("Number_two = %d\n", Number_two);
return 0;
}
// 位运算符还有 &按位与 |按位或 ^按位异或
#include<stdio.h>
int main()
{
int number1 = 5;
int number2 = 3;
int number3 = number1 & number2;
int number4 = number1 | number2;
int number5 = number1 ^ number2;
printf("number3 = %d\n", number3);
printf("number4 = %d\n", number4);
printf("number5 = %d\n", number5);
return 0;
}
打印结果:
解释:
//赋值运算符额相对较简单,在这就不提了
//讲一下单目操作符(-2,负二,负号旁边只有一个数) 双目操作符(a+b,加号旁边有两个数)
#include<stdio.h>
int main()
{
int number = 0;//在C中零和空表示假;非零非空为真
printf("%d\n", !number);// !逻辑反操作 number为0是假,反逻辑number为真就为非零和非空的数 在VS2022中 打印结果是1
return 0;
}
代码解释:
//常用于if(条件)或者if(!条件)
// 正数 + 负数 -,相对于容易理解,在这就不讲了; sizeof以前讲过(计算变量和类型所占空间的大小的); &取地址
/*
先讲一下整数在计算机中的存储(补码)
-1(负整数) 原码 10000000 00000000 00000000 00000001 C规定最高位为符号位,负数最前面数字是1,正数0
反码 11111111 11111111 11111111 11111111 符号位不变,其他位按位取反
补码 11111111 11111111 11111111 11111111 反码+1就是补码
正整数原码反码补码相同
为什么整数在计算机中以补码的形式存储呢?方便计算 举个例子 -1 + 1
如果拿原码进行计算 -1原码 100000000 00000000 00000000 00000001
1原码 00000000 00000000 00000000 00000001
加起来10000000 00000000 00000000 00000010答案是2 不符合逻辑的
拿补码相加 -1补码 11111111 11111111 11111111 11111111
1补码 00000000 00000000 00000000 00000001
相加 1 00000000 00000000 00000000 00000000
一个int类型4个字节,32个比特位,1舍去 为00000000 00000000 00000000 00000000
*/
#include<stdio.h>
int main()
{
int number1 = 0;
printf("number = %d\n", ~number1);// ~按位取反
return 0;
}
/*前置++(--原理相同) 后置++(--原理相同)*/
前置++:
#include<stdio.h>
int main()
{
int number2 = 2;
int number3 = ++number2;
printf("number3 = %d\n", number3);//先++后使用 (先number2 + 1 = 3,再给number3)
return 0;
}
后置++:
#include<stdio.h>
int main()
{
int number2 = 2;
int number4 = number2++;
printf("number4 = %d\n", number4); //先使用后++ (先将number2的值给number4,再将number2 + 1,此时number2的值为3)
return 0;
}
// int number5 = 3.14;整形类型你给我一个浮点型的值?? 编译器会报错 怎么办呢?
这时就用到强制类型转换了
#include<stdio.h>
int main()
{
int number5 = (int)3.14;
printf("%d\n", number5);
return 0;
}
//关系运算符 >= <= == > 等等啊 一般用在判断循环语句中的判断条件
//逻辑操作符 &&逻辑与 ||逻辑或 一般也是用在判断循环语句中的判断条件
后面的,小目录:
//条件操作符(也叫三元操作符) //举个例子,给你年份,让你看这年2月有多少天
#include<stdio.h>
int main()
{
int years = 0;
scanf_s("%d", &years);
int days = (years % 400 == 0 || (years % 4 == 0 && years % 100 != 0)) ? 29 : 28; //a?b:c a成立(为真)计算b,不成立(为假)计算c
printf("days=%d\n", days);
return 0;
}
//逗号表达式 用逗号隔开的一串式子
#include<stdio.h>
int main()
{
int number1 = 5;
int number2 = 4;
int number3 = (number1 + 2, number2 - 3, number1 + 1);//(number1 + 2, number2 - 3, number1 + 1)逗号表达式,从左向右以此计算,计算结果为最后一个式子number1 + 1
printf("number3=%d", number3);//打印结果为6
return 0;
}
// []下标引用操作符 (数组那) ; ()函数调用操作符,printf()中的()等等; . ->(结构体那讲过)
谢谢大家观看