//导入标准函数库(类似于java的导包)
#include <stdio.h>
//导入标准函数库(system、sizeof等等......)
#include <stdlib.h>
//windows系统的api
#include <Windows.h>
/*
void main(){
//输出函数
printf("hello world!");
//这是一个命令(在window里面特有的)
system("pause");
}
*/
//2、基本数据类型(int char float double long int short)
/*
%d - int
%ld – long int
%c - char
%f - float
%u – 无符号数
%hd – 短整型
%lf – double
%x – 十六进制输出 int 或者long int 或者short int
%o - 八进制输出
%s – 字符串
*/
/*
void main(){
int i = 28;
char c = 'D';
float f = 12.56;
double d = 99.999;
long l = 3544546;
short s = 50;
//控制台输出数据,需要使用占位符
//int->%d
printf("输出int类型的值:%d\n",i);
//char->%c
printf("输出char类型的值:%c\n", c);
//float->%f
printf("输出float类型的值:%f\n", f);
//long int->%ld
printf("输出long类型的值:%ld\n", l);
//double(类似于long float)->%lf
printf("输出double类型的值:%lf\n", d);
//short->%x
printf("输出short类型的值:%x\n", s);
system("pause");
}
*/
//3、输入输出函数
/*
void main(){
//注意:i
int i = 100;
//输出函数
printf("请输入一个整数:");
//输入函数(注意:输入函数赋值需要的是地址,而不是值)
//scanf("%d",&i);
//注意:不同编译工具,对函数支持不一样
scanf_s("%d", &i);
//打印i的值
printf("赋值之后的i的值:%d",i);
system("pause");
}
*/
//4、取地址,并且根据地址取值
/*
void main(){
int i = 100;
//输出i的值
printf("i的值:%d\n",i);
//输出i的地址
//&i:取出i变量的地址
//注意:输出地址,占位符%p
printf("i的地址:%p\n",&i);
//根据地址获取值:*(&i)
//总结:&表示取地址 *表示根据地址取值
printf("根据i的地址取出i的值%d\n",*(&i));
//什么是变量名:就是对内存的一段空间里的数据的抽象
//0x001CFDD0
//暂停
getchar();
}
*/
//5、指针存储内容(多级指针)
/*
void main(){
int i = 99;
//打印i的值
printf("%d\n",i);
//打印i的地址
printf("%p\n", &i);
//定义一个指针变量
//int* 是一个int类型的指针变量,可以存储一个int类型的变量地址
int* p = &i;
printf("指针变量p的值:%p\n",p);
//输出指针的地址
printf("指针变量p的地址:%p", &p);
//思考:以下代码输出的内容
//*代表取值 &取地址
printf("%d\n",*p);
//直接赋值
i = 200;
printf("变量i的值:%d\n", i);
//间接赋值(通过指针变量)
*p = 500;
printf("指针变量赋值后的i的值:%d\n", i);
getchar();
}
*/
//6、通过方法改变变量的值
//形参和实参是两个不同的变量,也就意味着重新开辟了内存
//错误写法
/*
void change(int a){
a = 20;
printf("形参a变量的地址:%p\n",&a);
}
void main(){
//实参
int i = 10;
printf("实参i变量的地址:%p\n", &i);
printf("修改前的值:%d\n", i);
change(i);
printf("修改后的值:%d\n", i);
getchar();
}
*/
/*
//正确的写法(指针实现)
void change(int* a){
//修改值
//*是取值
*a = 20;
printf("形参a变量的地址:%p\n", &a);
}
void main(){
//实参
int i = 10;
printf("实参i变量的地址:%p\n", &i);
printf("修改前的值:%d\n", i);
change(&i);
printf("修改后的值:%d\n", i);
getchar();
}
*/
//7、模拟一个外挂程序
/*
void main(){
//实参
//时间统计
int time = 60 * 10;
printf("time变量的地址:%#x\n",&time);
//注意:外挂程序修改主程序的数据
while (time > 0)
{
time--;
printf("游戏时间还剩%d秒\n",time);
Sleep(2000);
}
getchar();
}
*/
//注意:在这个地方你新建的文件必须是.c源文件,你不能够新建.cpp源文件,要不然你的注入总是失败
//主程序和外挂程序都是.c源文件
//8、指针为什么要有类型?
void main(){
//定义int类型的变量
int i = 10;
//定义long类型的变量
double d = 20.344;
//定义int类型的指针
int* p = &i;
//%#x占位符:显示16进制的值
//打印i变量的地址
printf("i变量的地址:%#x\n", &i);
//打印d变量的地址
printf("d变量的地址:%#x\n", &d);
//打印指针变量p的地址
printf("p指针变量的地址:%#x\n", &p);
printf("p指针变量修改前的值:%d\n", *p);
//将long类型的变量的地址赋值给了p指针变量
p = &d;
printf("修改后p指针变量的地址:%#x\n", &p);
printf("p指针变量修改后的值:%d\n", *p);
getchar();
//总结:因为指针存储的是一个内存地址,然而我们只根据一个地址读取对应的数据,
//但是你不知道什么时候读取完毕,也就导致了数据丢失,
//所以我们需要指定指针类型,确定什么时候读取完毕
//例如:char 2字节 16位 int 4字节 32位
}
整理自课程