1.指针概念(C++ primer)
1.1.通俗理解
将内存比作一座座房子,数据存在房子里,为了访问数据,我们需要知道房子的地址,这就是指针。
指针只是一个地址,它是一个整数,表示内存地址。
1.2 定义一个空指针
(C++11新引入的)
调试查看:
由于类型不同我们需要强制类型转换,但是我们可以看到结果是一样的,类型不会对内存地址产生影响。
那么指针类型的作用在哪呢
指针的类型,决定了它被加1的时候,字节走多少个。
1.3 解引用 (*p)
addtion: 我们定义的局部变量是创建在栈上的
1.4 附加:堆和栈的概念
reference1
reference2
预备知识—程序的内存分配
一个由C/C++编译的程序占用的内存分为以下几个部分
1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其
操作方式类似于数据结构中的栈。
2、堆区(heap) — 一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回
收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。
3、全局区(静态区)(static)—,全局变量和静态变量的存储是放在一块的,初始化的
全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另
一块区域。 - 程序结束后由系统释放。
4、文字常量区 —常量字符串就是放在这里的。 程序结束后由系统释放
5、程序代码区—存放函数体的二进制代码。
int main() {
char* buffer = new char[8]; //实验了new 分配在堆上
memset(buffer, 0, 8); //memset初始化内存 参数1:指针 参数2:初始化的值(对内存中的每个字节而言) 参数3:字节数
delete[] buffer; // 删除buffer占用的内存
buffer=nullptr; //也可以通过此操作回收指针
cin.get();
}
注意: 第三个参数不能用sizeof(buffer) buffer是个指针,win32下占4个字节,和你实际分配的内存大小无关。
memset()函数
1.5 二级指针
int main() {
char* buffer = new char[8];
memset(buffer, 8, 8); //memset初始化内存 参数1:指针 参数2:初始化的值(对内存中的每个字节而言) 参数3:字节数
char** ptr = &buffer; //二级指针指向buffer的地址
delete[] buffer;
cin.get();
}
看下内存
里面存的是buffer的地址
我们去访问该地址注意要逆序
关于为什么要逆序:
对于0x12345678:
Big endian:低------->高:12 34 56 78
Little endian:低------->高:78 56 34 12
牵涉到两大CPU派系。那就是Motorola的PowerPC系列CPU和Intel的x86系列CPU。PowerPC系列采用big endian方式存储数据,而x86系列则采用little endian方式存储数据
ASM:低端字节序(little endian)和高端字节序(big endian)
最后我们找到了buffer存储的内容