关于数组和指针的基础问题
今天偶尔看到一个问题,有如下代码:
- C/C++ code
#include <iostream> using namespace std; int main(int argc, char* argv[]) { int a[5] = {1,2,3,4,5}; int *ptr1 = (int *)((int)a+1); int *ptr2 = (int *)(a+1); cout<<hex<<*ptr1<<endl<<hex<<*ptr2<<endl; system("pause"); return 0; } 为什么输出结果为:
2000000
2
2000000我知道是大小端的原因,但是我就是不明白为什么两个结果不一样
(int *)((int)a+1)和(int *)(a+1)有什么区别呢?
谢谢回复!
[解决办法]
(int *)((int)a+1),先将数组指针a视为一个整数(这个整数数值上就是a所指向数组的首位地址),然后将这个整数+1——作为一个整数+1,和算术上的+1完全相同的含义。再然后将这个和看作是一个指向整数的指针。结果是:它的值是指向比整数数组首位多1的地址,不是一个被存入的整数的开始位置,而是其第二个字节所在的位置。同时,紧挨着这个整数的,数组中下一整数的最低位字节被视为该表达式所表达的整数的最高位字节(第4位),结果就是十六进制的 2 000。
(int *)(a+1),将数组指针a移动到数组中下一整数的位置上,并以其中所包含的整数为值。也就是返回数组中第二个整数的数值——完整的,不是被割裂重组过的。这个指针指向了这个整数的开始位置,而不是别的什么地方。于是输出:2,高位全是0,就不输出了。
[解决办法]
我想从上图你应该已经知道了吧! a 是数组首地址 a+1 数组第二元素个地址(+4了) 而(int *)((int)a+1) 先把数组地址变成整形在加一 在改为 指针!
可能说的不清楚!还看图吧!记住多调试!
[解决办法]
int a[5] = {1,2,3,4,5};
内存中是这样的:
//01000000 0200000000 03000000 04000000 05000000
a指向红色的
int *ptr1 = (int *)((int)a+1);
现在ptr1指向的如下所示(红色):
//01 0 00000 0200000000 03000000 04000000 05000000
由于ptr1是int型,有四个字节,所以向后找到四个字节,即
//01 000000 02 00000000 03000000 04000000 05000000
注意00 00 00 02两个一组,翻译过来是02 00 00 00,所以结果是
2000000
[解决办法]
[解决办法]
第一个(int)a+1 只是加了1个字节的长度,第二个int(a+1)就跟你机器字长有关系了,如果你的机器int占4个字节,那就是往前走了4位,指向了数组的第二个元素2. 了解否~~