蓝色大气网站欣赏如何做公司网络推广
目录
指针和数组
数组名和指针的区别
多维数组
数组指针
语法
作用
内存大小
自增运算
【】运算
指针和数组
结论:数组的本质就是指针。数组的【】运算同样可以用指针来运算
证明
C++代码
    int array[5];int* ptr{ &array[0] };*ptr = 5;array[0] = 5;array[1] = 5;array[2] = 5; 
汇编代码
    int array[5];int* ptr{ &array[0] };
002014F1  mov         eax,4  
002014F6  imul        ecx,eax,0  
002014F9  lea         edx,array[ecx]  
002014FD  mov         dword ptr [ptr],edx  *ptr = 5;
00201500  mov         eax,dword ptr [ptr]  
00201503  mov         dword ptr [eax],5  array[0] = 5;
00201509  mov         ecx,4  
0020150E  imul        edx,ecx,0  
00201511  mov         dword ptr array[edx],5  array[1] = 5;
00201519  mov         eax,4  
0020151E  shl         eax,0  
00201521  mov         dword ptr array[eax],5  array[2] = 5;
00201529  mov         ecx,4  
0020152E  shl         ecx,1  
00201530  mov         dword ptr array[ecx],5   
| int array[5]; | array[1] = 5; | 
| int* ptr{ &array[0] }; | 19 : eax=4 | 
| 002014F1 : eax=4 | 1E : eax<<0 | 
| 002014F6 : exc=eax*0 | 21 : array[4]=5 | 
| F9 : edx=array[ecx] | array[2] = 5; | 
| FD : [ptr]=edx | 29 : ecx=4 | 
| *ptr = 5; | 2E : ecx<<1 | 
| 00 : eax=[ptr] | 30 : array[8]=5 | 
| 03 : [eax]=5 | |
| array[0] = 5; | |
| 09 : ecx=4 | |
| 0E : edx=ecx*0 | |
| 11 : array[edx]=5 | 
从这里的汇编代码可以看出,每次偏移都是基于array进行偏移的,因为每句都有array的身影
而数组名也是一个地址,即指针。
【】就是个偏移符号,里面是1,就偏移1,是2 就偏移2
综上:array【0】里面,array代表起始地址,0代表了偏移量,偏移量是数组的下标,array【0】就是偏移了0,所以array就等于array【0】的地址
所以数组的下标也可以用作指针来表示
int array[2]{1,2};
int *ptr {array};
std::cout<<ptr[0];
ptr {&array[0]}
std::cout<<ptr[1]; 
这里输出了1和2
数组名和指针的区别
sizeof(array)sizeof(ptr) 
第一个结果为20,第二个为4,因为sizeof还是把array当成数组来计算的,而不是指针
多维数组
既然数组即指针,那么多维数组也肯定不存在,那多维数组是什么呢?它其实是一段连续的内存.
int a[2][3]
{{1,2,3},{4,5,6}
};
int *ptr{a}; 
这段代码是错误代码,因为在多维数组里面,因为多维数组的数组名类型并不是整型指针
多维数组名的类型是是一个数组指针
数组指针
语法
int (*ptr) 【3】{}
表示有3个数组的指针。
作用
可以用来处理有一行3个数据的数组
把指针数组的声明列出来比较一下
int *ptr 【3】: 表示有3个指针的数组
所以上面正确代码应该为
int (*ptr) [3] {a};
std::cout<<ptr[0][1]; 
这里输出了1
内存大小
每个指针大小为4字节,那么数组指针大小也是4字节
自增运算
int (*ptr) [3] {a};
ptr++加的是3*int
【】运算
根据上文可以推断,a【0】,a是地址,0是偏移量,所以在多维数组里面,a【2】【3】里面的a【2】其实是一个地址,而3指的是偏移量
