指针
指针是一个变量,用于存储另一个变量的内存地址。通过指针,可以间接访问和操作存储在该地址上的数据。
指针的定义时候,它必须指向一个地址.这个地址可以是某个数组的起始地址,也可以是某个变量的地址.注意区分指针定义与解引用的概念.
int value = 42;
// 定义方式1, 将变量的地址赋值给指针
int* ptr = &value;
// 定义方式2, 将数组地址(起始地址) 赋值给指针
int* ptr2 = new int[10];
指针通俗的理解就是有一个变量,他的值存储的是一个地址.该地址指向的内存是同一种类型(对象). 我们一般用指针来操作数组. 但指针并不是只能操作数组. 例如:变量a(int)的地址是:0x1000,变量b(int)的地址:0x1004,指针指ptr指向a的地址. 那么将指针进行+1然后解引用,就是变量b了.*(++ptr) .数组在内存中是连续的.所以指针操作数组最为常见.
基础概念:
- windows中,地址的单位是
byte.int占用4字节. 包括malloc分配的单位也是byte,一般操作系统的单位都是byte. - windows内存是小端序
- 在代码中:
*是解引用,int*是声明指针.&是取地址.int&是声明引用类型
形参类型为指针,传递的是指针的值(指针指向对象的地址); 类型为引用类型,传递的是地址. 本质上都是地址.只是指针是地址的值,引用对象是对象的地址. 形参为对象,传递是是拷贝值.
指针传参可以为nullptr ,引用类型不能为空指针.
内存的申请与回收
在栈上申请的内存,会随着局部方法的结束,自动释放.在堆上分配的内存,需要回收.
#include <iostream>
int main() {
int* ptr = new int; // 动态分配内存
*ptr = 42;
std::cout << *ptr << std::endl; // 输出 42
delete ptr; // 释放内存
ptr = nullptr; // 避免悬空指针
return 0;
}
malloc 分配内存
#include <iostream>
#include <cstdlib> // 包含 malloc 和 free 的声明
int main() {
int* ptr = (int*)malloc(sizeof(int)); // 分配一个 int 的内存
if (ptr == nullptr) { // 检查分配是否成功
std::cerr << "Memory allocation failed!" << std::endl;
return 1;
}
*ptr = 42; // 初始化内存
std::cout << *ptr << std::endl; // 输出 42
free(ptr); // 释放内存
return 0;
}