C++笔记:指针和数组

1. 实验

1.1 源码
	int a[5];
	int* ptrA{&a[0]};
	*ptrA = 5;

	a[0] = 5;
	a[1] = 5;
	a[2] = 5;
1.2. 反汇编
	int a[5];
	int* ptrA{&a[0]};
003417D2  mov         eax,4                     // eax = 4
    
	int a[5];
	int* ptrA{&a[0]};
003417D7  imul        ecx,eax,0                 // ecx = eax * 0
003417DA  lea         edx,a[ecx]                // edx = a[0]
003417DE  mov         dword ptr [ptrA],edx      // [ptrA] = edx;     ptr 代表指针。 "[ ]" 里的内容代表内存地址。 
	*ptrA = 5;
003417E1  mov         eax,dword ptr [ptrA]      // eax = [ptrA]  = edx = a[0];
003417E4  mov         dword ptr [eax],5         // [eax] = 5;   往eax的内存地址中,写入5, 即 a[0] = 5( a的起始地址偏移 0)

	a[0] = 5;
003417EA  mov         eax,4                     // eax = 4;
003417EF  imul        ecx,eax,0                 // ecx = eax * 0
003417F2  mov         dword ptr a[ecx],5        //a[0] = 5
	a[1] = 5;
003417FA  mov         eax,4  
003417FF  shl         eax,0                     // eax << 0    -->    eax = eax * 1  = 4
00341802  mov         dword ptr a[eax],5        // a[4] : 从a的起始地址偏移 4 (一个int),即数组的第二个数值
	a[2] = 5;
0034180A  mov         eax,4  
0034180F  shl         eax,1                     // eax << 1  -->   eax = eax * 2 = 8
00341811  mov         dword ptr a[eax],5        // a[8] : 从a的起始地址偏移 8 (两个int),即数组的第二个数值

2. 结论

数组的底层实现是利用了指针。

数组的本质是连续的内存区域。

从原理上来讲,指针和数组是同一个方法的不同表达,而数组名本身就是一个指针,数组元素只是这个指针按照一定量偏移后对应的内存区域里的内容。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值