只要你愿意 开始总比放弃好。 Roman.
愿我们都有自己的目标并正在为其不懈努力。
最近学习的小结 算是给愿意重新的自己的一种交代 告别2021.
十二、指针
一)内存
1、为了更好地管理内存,将内存划分为一个个小的内存单元,每个内存单元大小是1byte
- 不使用bit作为内存单元大小是因为其太小,太浪费内存,如简单的char类型是1byte,这将会浪费8bit,即8个内存单元
- 给每个内存单元进行了编号,编号即为内存单元地址
2、如何进行编号?
依据位数进行编号
①如:32位机器其有(2^32)种排列方式,即其编号最大数为(2^32)
所以,有最大空间(2^32)byte,依次除以1024可以得到其内存空间大小4GB(1024是相邻两单位间的换算关系);如此就可求得64位机器的内存
②同样,再以32位机器为例,其每一位都有0/1两种可能,故才有了(2^32)种排列方式,即编号最大数
③32位,即为32根地址线/数据线
地址线:类似于电线,通电后电线号可以转换成数字信号1/0(高低电平)
其范围:00000000000000000000000000000000(32位)
......
11111111111111111111111111111111(32位)
二进制表示时长度太长,故换用十六进制表示--8位十六进制数字即可表示32位二进制
如:0x00000000 0xFFFFFF (其中 0x 是十六进制的标志前缀)
- 将其转换为十进制后的值即为地址编号
3、当变量占多个字节时,只关注变量的起始地址就可
%p是打印地址的,如:printf("%p\n",&a) 最后打印结果是a的首地址
二)指针变量
1、内存单元都有编号,这个编号就是地址,把该地址叫做指针!
2、 int * pa=&a;
用pa来存放a的地址,类型是 int * (int* 是因为a的类型是int,当a的类型改变时int也随之改变)
①将pa 叫做指针变量
②* 的意义:pa 是一个指针变量
③int 告诉我们:pa指向的对象是int 类型的
3、*pa pa是指针变量,*是解引用操作符
它的意思是:通过pa 中存放的地址找到 pa指向的内容:如 *pa ='a' ; 则代表 pa指向的内容被修改为a
4、指针变量的大小:大小固定为4byte!(32位机器)
因为指针变量即地址,地址32位即32bite=4byte; 当然,如果64位机器,则64bit=8byte大小!
三)结构体
struct 是C语言自定义数据类型 不是内置数据类型
1、C语言想要描述复杂类型 如:描述学生:名字、年龄、性别、学号等
1)//结构体类型--相当于图纸
struct Stu
{
//名字--字符串 用数组表示字符串!
char name[20];
//年龄--整数
int age;
//性别--字符串
char sex[5];
//学号--字符串
char id[20];
};
写在main 函数外面!
2)在main函数中调用
//结构体变量--相当于房子,真正存储
struct Stu s1={"张三",18,"女","20203101218"}; //初始化
//直接打印
printf("%s %d %s %s\n",s1.name,s1.age,s1.sex,s1.id);
//函数打印
主函数内:Print(&s1);
主函数外写出函数:
void Print(struct Stu * ps)
{
//printf("%s %d %s %s\n",((*ps).name,(*ps).age,(*ps).sex,(*ps).id);
printf("%s %d %s %s\n",ps->name,ps->age,ps->sex,ps->id);
- 补充输入
//输入
scanf("%s %d %s %s\n,s1.name,&(s1.age),s1.sex,s1.id);
//注意:此时是 变量. 然后注意数组名即地址,不需要加&,但是int 要加&
}
3)注意:指针变量解引用后.
(地址)指针变量->
4)可以给结构体类型重定义名称,便于后续使用
如: typedef struct Stu
{
}stu;
之后使用时就可以将 typedef struct Stu 全部改为stu
2、struct是结构体关键字
3、结构体指针->结构体成员
结构体变量.结构体成员
(结果欧成员访问操作符 . ->)
十三、编译器
1、GCC
2、MSVC:如VS2019集成开发环境
工具--选项:可以修改字体颜色等
调试:f10
十四、C语言程序
写代码(以VS2019为例):
1)编译器
2)新项目/空项目:
①项目名称不要汉字
②不要加特殊字符
③不要空格
④注意修改存储位置(可以新建文件夹等)
⑤视图--解决方案资源管理器
3).c 源文件 .h 头文件 .cpp(C++源文件)
4)代码
①VS2019 首先要在源文件中写入: #define _CRT_SECURE_NO_WARNINGS 1
- VS认为C语言提供的scanf存在安全问题,用scanf_s 可以解决,但是不具有普适性,所以最好是在源文件加入上述语句,继续用scanf
- VS中新建的源文件都是拷贝newc++file.cpp 文件的,故找到该文件并拷贝至桌面,输入以上后再按原路径替换即可永久保持,一打开就存在
②主函数
int main()
{
return 0;
}
- int 整型 与后面return 的0 相对应
- 主函数只有一个
- 在同一个项目下 即使多个源文件存在,但是只能有一个主函数!
- 主函数是程序入口!
③printf 打印函数:在函数中需要 #include<stdio.h>
std i o :标准输入输出函数
④scanf 输入函数
- 数组输入无& 直接输入数组名就行(数组名即地址)
- scanf 不关心输入字符串长度是否溢出,故其不安全
5)编译 链接 运行:ctrl+f5 or ctrl+fn+f5
十五、计算机单位
bit byte kb mb gb tb pb
1 byte=8 bit 除外,相邻两个单位间的换算关系都是1024
十六、补充内容
多组输入: while(scanf()!=EOF) { }
- scanf函数调用失败时,返回 EOF
- EOF 文件结束 其本质是 -1