Chinaunix首页 | 论坛 | 博客
  • 博客访问: 802880
  • 博文数量: 330
  • 博客积分: 9641
  • 博客等级: 中将
  • 技术积分: 3181
  • 用 户 组: 普通用户
  • 注册时间: 2007-01-19 14:41
文章分类

全部博文(330)

文章存档

2012年(17)

2011年(135)

2010年(85)

2009年(57)

2008年(36)

我的朋友

分类: C/C++

2009-11-24 00:31:42

(09:34:36 PM) McGrady: hi,老牛
(09:38:43 PM) 雾夜森林: 问你个问题?
(09:39:36 PM) 雾夜森林: 数组int a[4] = {1,2,3,4};是不是a在内存里面是一个int型的指针
(09:40:18 PM) 雾夜森林: 占4个字节,存放数组的首地址
(09:40:44 PM) McGrady: ?什么东西?
(09:41:14 PM) 雾夜森林: int a[4] = {1,2,3,4};
(09:41:26 PM) 雾夜森林: 在内存里面是一个int型的指针,占4个字节,存放数组的首地址
(09:42:37 PM) 雾夜森林: a 在内存里面是一个int型的指针,占4个字节,存放数组的首地址
(09:43:00 PM) McGrady: 恩
(09:43:21 PM) McGrady: 怎么了?
(09:43:38 PM) 雾夜森林: 看来我的推测是正确的,小超说a不存在,让我感觉毛骨悚然
(09:50:42 PM) McGrady: 他说的不存在是说 a不是一个变量吗?
(09:51:07 PM) 雾夜森林: 不是,他说对,但是你看这个问题就明白了。
(09:51:19 PM) 雾夜森林:     int a[5] = {1,2,3,4,5};
    int *p = (int *)(&a+1);
    printf("%d,%d",*(a+1),*(p-1));
(09:51:54 PM) 雾夜森林: &a是什么意思,难道&a=a,这个问题的结果是:2,5
(09:53:57 PM) 雾夜森林: 照我上面说的,&a应该是内存中某个地方,但是这里的结果却推导出&a和&a[0]相同
(09:55:57 PM) McGrady: 等等,我先想想
(09:56:40 PM) 雾夜森林: 好,就是调试的结果是&a和&a[0]相等
(10:10:57 PM) McGrady: 应该是这样的
(10:11:52 PM) 雾夜森林: 哪样?我刚才讲的矛盾之处
(10:12:29 PM) 雾夜森林: &a在内存的某个地方,儿这里又是&a=&a[0]
(10:13:29 PM) 雾夜森林: a 在内存里面是一个int型的指针,占4个字节,存放数组的首地址.结论是:a=&a[0]
(10:13:42 PM) 雾夜森林: 调试结果是:&a=&a[0]
(10:14:13 PM) 雾夜森林: 于是a=&a=&a[0]
(10:14:36 PM) 雾夜森林: 但是调试a是:$1 = {1, 2, 3, 4, 5}
(10:18:33 PM) McGrady: 数组名能够转化成指针,比方 比如int[x][y][z]类型能够转换成int[y][z]*类型。 所以,&a 实际上转化为了 int [5]* 即一个二维数组的首地址, 而 &a[0] 是一维数组的首地址,故虽然结果是相等的,但是是两种不同类型的指针.  
(10:20:39 PM) McGrady: a是符号名,存放在符号表中,&a 并不取a的内存地址,而是转化为了二维数组的首地址。
(10:21:16 PM) McGrady: 因此 你上面的程序得出 2,5的结果也不足为奇。
(10:21:58 PM) McGrady: clear?
(10:23:13 PM) 雾夜森林: &a[0]是一维数组,&
(10:23:26 PM) 雾夜森林: &a是二维数组
(10:24:00 PM) McGrady: en  
(10:26:33 PM) 雾夜森林: a是符号名,存放在符号表中,&a 并不取a的内存地址,而是转化为了二维数组的首地址。这样就明白了
阅读(607) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~