一、什么是指针:
笔者采用C primer plus的解释:“指针是一个变量,其存储的是值的地址,不是值本身”。
1. 指针应用举例:在在内存分配中常常会用到一根指针指向已经分配的内存,在游戏外挂中 用指针指向道具的内存地址,运用这根指针进行“锁血”,“无限子弹”等操作。
2,指针的基本模样及定义;
例子:int data =9;
int *p = &data;
定义了一个指针p指向data这个整形变量;形式就是在变量前面加个*号。 由于变量p是指针 那么它可以保存data变量的地址,地址用‘&’取地址符获取 就像scanf中的使用 知道了地址才能操作这个变量。那么既然p保存了变量data的地址 那么关于p的操作会影响到变量data。
友情提示: int *val,data; //只定义了一个指针变量 p,data是普通整形变量 ! 二、演示
#include <stdio.h>
int main(void)
{
int data = 223;
int *p = &data;
printf("%d \n",*p);
return 0;
}
运行结果:
用‘&’获取变量的地址,用*号可以访问指向变量的值;所以输出 *p就是输出data。
*号又称解除引用运算符,不直接使用它指向的地址,而直接使用这个地址对应的变量。
p = &data; //获取了data的地址 0095FDC8 那么可以通过这个地址访问data
*p = 888,*p = 777; // 这种操作会改写data的值 等价于 data = 888,data = 777;
不光有int类型指针还有char,double等 你甚至可以用char指针指向 int 类型。
可以利用指针将其他软件内存数据修改掉。
三、必知必会
指针使用前需要初始化,因为指针默认是有指向的。你定义一个指针 编译器会自动让他获取一段内存,而这块内存的数据或许无人使用 或许是正在运行的程序的内存(多个指针可以指向同一个内存)。你一修改便改了程序中某个变量的值或其他重要的数据。戏剧性的是:这个指针指向的变量或许是你这个程序的某个变量,你不知道 一修改就完蛋了。有些编译器会提供警告或其他处理。C/C++这种强有力的语言是不做限制的,所以使用前先初始化。
指针可以指向其他软件使用的内存 就说最简单的单机游戏,你可以试验一下 用CE找到道具地址,用C语言指针转化一下并指向它 再修改其值 会出现惊喜。
还有就是 指针默认指向的可能是上一个程序使用完后的垃圾数据,经过特殊处理可以将这个数据还原,或者你会看到图片 或者嗯...
指向其他软件内存经过处理可以感染病毒。
第二节 内存分配
一、控制内存是程序员必须掌握的内容
C语言提供了 malloc、realloc、calloc、alloca等接口来开内存。
由于静态内存是由系统自动分配并释放的,在函数结束后自动释放,不能再被使用。
int array[128] = {0};
“释放内存”这个意思不是说直接把这块内存的数据清空,而是把这块内存的使用权限归还给操作系统。
动态分配的内存空间可以跨函数使用:
p[0]的值就为1,没赋值的是填充字。
malloc()只接受一个整形的参数
int *p = (int*)malloc(100);
问:该语句分配了几块内存?
答:该语句分配了两块内存 ,一个是静态分配的占4个字节与p变量产生关联(指针只占4/8个字节)另一个分配了大小为100个字节的空间。
malloc函数只接受一个参数,如果成功分配就返回第一个字节的地址,不成功返回NULL;
返回的地址为void*类型,我们要使用就要把它转换为 int*,double*,char*的类型,把第一个字节的地址转换为需要的类型就可以对其操作,如果是int*则4 个一起挨个划分 相当于有25个变量。
malloc分配操作:
int *p = (int*)malloc(sizeof(int) * 10)
分配40个字节来使用,主要要使用sizeof来计算类型大小,不然内存太小/太大会出错
数组的长度为10。
C++ 使用关键字 new;
int *p = new int;
int *p = new int[10];
二、释放内存
函数 free()
例子:free(p);
C++
delete p;
delete[] p; //用[]分配后用这个
三、用完的内存记得手动释放
用完的内存记得手动释放,不然会造成内存泄漏,内存越用越少 电脑就越慢。以前的操作系统就是忘了释放内存而导致内存泄漏,一天吃一点内存,后面就吃没了......
本章完!
2021年10月31日16:04:22