最好的C++教程 16. pointer in C++

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存储的内容
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值