1 建文件
2 '\0' 0 '0'的区别
'\0' 是一个字符,转义字符,ASCII是0。
0 数字0,数值上和\0等价
’0‘ 字符0 对应ASCII的值是48
3习题
1)
EOF =end of file 文件结束标志 其值=-1
2)strlen见到\0才停止,如果见不到0则打印随机数。
#include<stdio.h>
int main() {
char arr[] = { 'a','b','c','t'};
printf("%d\n", strlen(arr));
return 0;
}
strlen(arr)打印随机值
3)
4)数组大小用常量指定,用n不可。
B
B选项
#include<stdio.h>
int main() {
int n = 10;
int arr[n] = {0};
//n是变量,所以报错,在int n前面加const,也报错,因为n还是变量。
D选项
char ch[]="hello bit" 空格也算
数组一共存放10个字符\0实际存储了。(仅打印的时候不显示)字符串长度是不算\0,长度为9。
打印结果都是9
总结:字符数组长度/0存储了算长度,字符长度不算\0,数到\0停止不包括\0。
5)含转义字符长度,看到strlen时\0t停止 打印结果7
\t \121各算一个
4 写代码
1)求两个数的较大值
1.1固定数字的比大小
int num1 = 10;
int num2 = 20;
if (num1 > num2)
printf("较大整数:%d\n", num1);//前面是"XXX:%d\n",s输出的值
else
printf("较大整数:%d\n",num2);
1.2手动随便输入比大小-scanf("%d%d",&num1,&num2);
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int main() {
int num1 = 0;
int num2 = 0;
printf("请输入两个整数num1,num2:");
scanf("%d%d", &num1, &num2);
//可以直接赋值num1=10;num2=20;
if (num1 > num2)
{
printf("较大整数:%d\n", num1);
//前面是"XXX:%d\n",s输出的值;
}
else
{
printf("较大整数:%d\n", num2);
}
return 0;
}
!!!!!最好自己手动敲,复制代码报错看下面Notpad++(2)-eg,so easy!
复制后的代码-----------------------> utfg-8下的代码---------------------转为ANSI编码(多?和空格)
(Notepad++软件新建文件-编码格式设置为utfg-8)
最后将乱码去掉即可!删除干净哦!
参考文章::此文件中的某些Unicode字符未能保存在当前代码页中,是否以Unicode编码重新保存此文件..._ruoge2007的博客-CSDN博客_此文件中的某些unicode
(2)用函数体(求两个数的较大值)
!!!!!不知道代码能不能直接用,不能的话(很简单!)就用Notpad++,后面有写,这个整半天原来是这样┭┮﹏┭┮。
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
int MAX(int x, int y)//带函数的
{
if (x > y)
return x;
else
return y;
}
int main() {
int num1 = 0;
int num2 = 0;
printf("请输入两个(num1, num2)");
scanf("%d%d", &num1, &num2);
//可以手动赋值
//int num1=20; int num2=30;
int max = MAX(num1, num2);
printf("最大整数%d\n", max);
return 0;
}
eg:Notpad++部分!举例我自己复制完是这样的!
打开 notepad++, 新建空白文档,设置编码格式为 utf-8 编码,将代码粘贴, 再转为编码ansi
utf-8下的代码 转为ansi
将乱码删除(注意空格!)再将代码复制即可。
方法参考:
此文件中的某些Unicode字符未能保存在当前代码页中,是否以Unicode编码重新保存此文件..._ruoge2007的博客-CSDN博客_此文件中的某些unicode
简单总结:最好自己打一遍哦。
求两个较大值步骤:
1 先写个函数MAX( , ); 找最大值,帮两个数
2 MAX(num1 ,num2 ); 找谁(这两个数)的 (求出最大值通过返回值方式返回给MAX)
MAX包括n1 n2,算较大值,将其结果值传给MAX(MAX=num1/num2)
3 max=MAX(num1 ,num2 ),用一个变量接受函数的返回值
4 print("%d\n",max) 打印接收函数max在显示在%d这里
5 创建int MAX(int x,int y){
if (x>y)
return x;
else
return y;
}//谁大返回谁
5 size of对数组进行计算:
sizeof(a)等价sizeof a a是变量
size of是操作符,不是函数,因为sizeof的括号不能省略掉。
int arr[]={1,2,3,4,6} 数组可以不指定大小,通过初始化,通过赋值来确定数组大小
int是数组元素类型,不是数组的类型,数组的类型是int[6]
size of对数组进行计算:
int arr[] = { 0,1,2,3,4,5 };//6个元素,每个元素是整型,1个元素=4bit
printf("%d\n", sizeof(arr))=4*6=24;//4 //计算数组大小。单位是字节
数组放在size of内size of(arry)
数组大小=数组元素个数*一个元素的大小
计算数组元素个数=数组大小/一个元素的大小=sizeof(arr)/sizeof(arr[0])
6 补码如何求源码
看源码的正负:看最高位,0为正数,1为负。
负数的补码:将源码-反码(最高位不变,其余取反),然后+1。
已知补码求源码:将补码-1,在反码(取反符号位不变其余取反)。
计算机的在数据存储时候存储的是二进制的补码方式进行存储,打印的是源码。
int main() {
int a = 0;//4字节=32bit(位) a 0000 0000 0000 0000 ~(按二进制取反,~按位取反0/1转变)
int b = ~a;//b是有符号的整型 b 1111 1111 1111 1111 补码(最高位符号位为1代表负数)
( 负数以补码的形式存储在计算机里) -1 求源码:补码-1然后取反
printf("%d\n", b); 1111 1111 1111 1110 取反(符号位不变) return 0;
} 打印结果为-1 1000 0000 0000 0001 (取反)使用的打印结果是源码
- ..........................1
总结:
负数源码 ——(符号位不变,其余取反)—>反码+1= 补码
补码(最高位为1时)-1 +取反(符号位不变)———>源码
7 操作符a++ a--/++a --a
printf("a=%d b=%d\n", a,b);//打印两个结果用一个print的写
后置++(后加),先使用a的值在++,b=10,a=a+1
前置++(先加),a=a+1=11,b=11
int a = 10;
int b = a++;//后置++,先用后+1 b=10 a=11
int b = ++a;//前置++,先a自+1后用 a=a+1=11=b
int b = a--;//后置--,先用后-1 b=10 a=9
int b = --a;//前置--,先-1 a=a-1=9=b
总结:a++a--(后加减1)++a--a (先加减1)
8 类型的强制转换(类型)
int a=3.14;(X)
int a=(int)3.14;double->int
9 逻辑操作符&&(逻辑与),||(逻辑或)
&&逻辑与只在乎两边的真假( 都真才真)
0表示假,非0表示真。
&&举例(都真才真)
int a=0;假 int b=5;真 int c=a&&b=假=0;
|| 举例(有真则真)
真->1
10 条件操作符(三目操作符)
一共有三个操作数exp123
exp1?exp2:exp3=(a > b? a : b)
exp1是条件表达式,条件成立取a,不成立取b。
11关键字
1)auto int a = 10;
//a是局部(自动)变量,a只可以在括号里面使用,括号外没有
//自动创建自动销毁,也叫自动变量
//auto省略掉了,本来局部变量都有一个auto,通常省略掉。
2)char字符类型 const常变量 enum枚举 extern引入外部符号 float单精度浮点数 long长整型
return返回short短整型 signed有符号的 static静态 struct结构体关键字 switch case
typedef类型定义 union联合(共用)体 void空 volatile体现C语言段位的
3)register:
原本从内存里拿数据—>cpu(早期内存访问速度和cpu处理速度比较搭配)后来cpu速度越来越快,内存访问速度跟不上Vcpu。所以有了高速缓存(用来解决内存和cpu速度不匹配问题的)和寄存器,所以从寄存器中拿数据到cpu,它的访问速度较快。
计算机进行一系列运算过程:
cpu去寄存器中拿数据,但寄存器里无数据,内存数据--加载到->高速缓存--加载到->寄存器,cpu可以拿数据啦!当CPU中没有拿到数据时在向下(高速缓存和内存中)访问,访问内存在依次向上传数据给寄存器,cpu在访问寄。
总结:cpu去寄存器中拿数据
register int a = 10;//a放在寄存器里面,a为寄存器变量。
仅仅建议a定义为寄存器变量(但寄存器有限,变量太多,最终a决定要不要放在寄存器中取决于编译器)
4)signed(有符号/有正负)/unsigned(无符号(位)/全正)
(signed) int a = 10; int是有符号的,int 定义的变量可负可正,signed可省略
a = -2;
unsigned int num = 0; num无符号数没有正负之分,永远都是正的
尽管放个负数,num也认为是正数
5)typedef-类型定义-类型重定义
原本unsigned int num1 = 20;
typedef unsigned int u_int;//重命名,通过typedef, unsigned int=u_int
u_int num1=20;//在定义变量
6)static-修饰局部变量
局部变量的作用域:
void无返回值的函数,是空类型不用输出的数。
过程:a是局部变量,进入作用域,a创建,a=2,函数出去,a出去,a销毁。i++。a出{}后a=2就不存在了,a=2只在{}内成立。
局部变量a进入它的范围生命周期开始,而出了它的生命周期范围销毁,空间还给系统。栈自动·清除内存里的内容。局部变量的作用域和生命周期就是在{}(它们所定义的代码块内)。
局部变量是进入它的作用域,生命开始。出函数范围,生命周期到了,局部变量销毁哦!空间还给系统。
①静态局部变量-static+局部变量(改变了局部变量的生命周期变长啦)
static修饰局部变量
static修饰局部变量,局部变量生命周期变长。
静态和全局变量一样,当某程序创建后,只会到这个程序完全退出才会销毁。
静态局部变量存放在内存的全局数据区。函数结束时,静态局部变量不会消失,每次该函数调用 时,也不会为其重新分配空间。它始终驻留在全局数据区,直到程序运行结束。
静态局部变量具有局部作用域,它只被初始化一次,自从第一次被初始化直到程序运行结束都一直存在,它和全局变量的区别在于全局变量对所有的函数都是可见的,而静态局部变量只对定义自己的函数体始终可见。
局部变量 静态局部变量区别:
总结: void test() void test()
{ {
int a=1; 局部变量 static int a=1;static+局部变量=静态局部变量
} }
局部变量 静态局部变量
a是动态的,也就是auto类型 函数调用后不在回收。仅仅初始化一次。
第一次被初始化后在调用函数时不在被初始化。
生命周期 {} 整个程序执行期。
局部变量的值,用一次就销毁 静态局部变量不会销毁,会一直保持到下一次引用。
static在修饰变量的时候,static修饰的静态局部变量只执行初始化一次,而且延长了局部变量的生命周期,直到程序运行结束以后才释放。
static 修饰全局变量的时候,这个全局变量只能在本文件中访问,不能在其他文件中访问,即使是外部声明也不可以 。
②static修饰全局变量(全局变量的作用域只在static修饰的文件内使用)
extern用来声明外部符号的
外来的,外部的
static改变了全局变量的作用域,让静态的全局变量只能在源文件内部使用,出了源文件无法使用。
不给除了静态的全局变量所在文件以外的文件用。static不能跨文件使用。
③static 修饰函数-改变了函数的链接属性。断了
普通函数,具有外部链接属性,当static修饰函数时,断了(外部链接属性->内部链接属性)
普通函数可以跨文件使用:
static修饰的函数(只能在本文件中使用)
可以说成是改变了函数作用域(类似全局变量)
准确说法:普通函数,具有外部链接属性,当static修饰函数时,断了(外部链接属性->内部链接属性)
7)define定义的常量和宏
#define定义标识符常量
#define MAX 100
main(){//MAX=100
int a=MAX;
return 0;
}
12指针
地址个数:32^2
一个内存单元应该是多大?
一个空间(一个格子)假设一个比特:计算机为32位机器
2^32种编号,如果一个内存单元是一个比特位,访问2^32比特位空间,找计算器
2进制转化10进制(DEC)
1byte字节=8bit
4294967296(bit)/8=()byte/1024=()kb/1024=(512)mb/1024=0.5GB
最多访问0.5GB,给2/4GB用不完,不合适
0.5*8=4GB合适,所以一个空间一字节。
一个地址存放1个比特位,但是这样内存就0.5g太小,所以应该是1个地址放存放1个字节就是8个比特位。
第一种情况,假设一块是一比特,总内存就是0.5g.第二种情况,一块是一字节,也就是8比特位,总共内存4g。(32位计算机内存四GB是上限)
&取地址符,指针,指针大小
打印的是16进制化成2进制
&a(a的地址)=p里面存的数
*p=20 将a值改变
总结:
指针变量专门存放地址
int a = 10;//&a取地址
int*p= &a;//*p解引用操作符。p里内容为a的地址,p指向a
*p = 20;//p里面存放地址对应的变量值改为20,*p,p改a内容
指针是个变量,是用来存放地址的
存地址用指针
指针变量大小:32位平台-4字节,64-8字节
指针存的是地址-32/64个二进制位-32/64比特位的空间=4字节/8字节(指针变量大小)