首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

指针!初学者

2012-04-10 
指针!菜鸟!1:下列程序运行结果:5,2000000#includestdio.hint main(){int a[5] {1,2,3,4,5}int *ptr1

指针!菜鸟!
1:下列程序运行结果:5,2000000

#include<stdio.h>
int main()
{
  int a[5] = {1,2,3,4,5};
  int *ptr1 = (int *)(&a + 1);
  int *ptr2 = (int *)((int)a + 1);
  printf("%x,%x",ptr[-1],*ptr2);
  return 0;
}
2: 还有:我怎样查看内存呐?
谢谢!

[解决办法]
调试 -> 窗口 -> 内存
[解决办法]
1、&a地址是数组的起始地址,加1说的是加上一个数组大小单元,即此时已经到了a[5],当然这个我们是不能访问的(数组越界),所以ptr[-1]就是a[4],即5。-1表示ptr前一个地址(单位是int *)
2、(int)a表示强制类型转换,数组的起始地址转换成整型,假设是0x1000 0000,(int)a + 1等于0x1000 0001,这个地址属于数组第一个元素的地址范围,即数组元素在内存中的存放如下:
a[0] 0x0000 0001
a[1] 0x0000 0002
a[2] 0x0000 0003
a[3] 0x0000 0004
a[4] 0x0000 0005
根据你的输出,可知系统使用小端字节序,即数组元素在内存中真实排序如下:
01 【00 00 00 02】 00 00 00 03 00 00 00……
即(int *)((int)a + 1),最后输出就是取【】这个地址存储的值,即0x2000000

 
[解决办法]
vc下使用watch窗口查看内存,linux下使用命令查看
[解决办法]
初始化一个int *类型的指针变量ptr2,然后赋值

探讨

int *ptr2 = (int *)((int)a + 1);

这个是什么意思啊

[解决办法]
int *ptr1 = (int *)(&a+1); // 设a数组的地址为1000;
则(&a+1) = 1000+ 1*sizeof(a) = 1000+20 = 1020;
即ptr1 的值为1020;
ptr1[-1] = *(ptr1 - 1 * sizeof(int*)) = *(1020 - 4) = 5;
地址1016正好是元素5所在的地址。
[解决办法]
把a视作一个整数,给它加1,然后作为整型指针赋给ptr2。

实际作用就是使ptr2指向比a高一个字节的位置。是数组a里[0]元素的第二个存储位置。

热点排行