免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 3484 | 回复: 12
打印 上一主题 下一主题

[C] 为什么这两个指针的地址是一样的?本人百思不得其解! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-03-23 18:01 |只看该作者 |倒序浏览
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
    int arr[2][3] = {
        {0,1,3},
        {4,5,6}
    };

    printf("0x%08X\n", arr+1);
    printf("0x%08X\n", *(arr+1));
    
    return 0;
}

打印出来的地址是一模一样的,为什么会这样?请指教!

[ 本帖最后由 bxb_koala 于 2009-3-23 18:06 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2009-03-23 18:18 |只看该作者
原帖由 bxb_koala 于 2009-3-23 18:01 发表
#include
#include

int main(void)
{
&nbsp;&nbsp;&nbsp;&nbsp;int arr[2][3] = {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{0,1,3},
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{4, ...


你要打印出第二列的第一个数字"4",就要
printf("%d\n",**(arr+1));//双重指针,arr+1指向{4,5,6}的起始。

因为arr是静态数组,并不是真正意义上的指针,arr[2][3]在内存中的实现就是一维数组,编译器根据你的代码来决定arr[xxxx]是什么语义。arr+1就是arr首地址+12,这个是编译时决定的而不是运行时得到的信息。

[ 本帖最后由 jeanlove 于 2009-3-23 18:20 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2009-03-23 18:23 |只看该作者
原帖由 jeanlove 于 2009-3-23 18:18 发表


你要打印出第二列的第一个数字"4",就要
printf("%d\n",**(arr+1));//双重指针,arr+1指向{4,5,6}的起始。


打印数字“4”,我知道用上面的表达式就行了,arr+1我也知道指向{4,5,6}的起始。但是为什么我那两种不同形式的打印语句,打印出的地址结果却是相同的!

论坛徽章:
0
4 [报告]
发表于 2009-03-23 18:23 |只看该作者
*(arr+1)并不是在运行时去取arr之后第12个字节的内容,而是由编译器在编译时等同于了arr+1。指针取值的语义是运行时的,这里的编译时类型arr是静态数组,到底什么含义,编译器替你决定。

因此我只能说编译器替你做了一个决定,写了一个绝对量到*(arr+1)编译得到的临时变量里面。而**(arr+1)是在运行时程序去取得的,过程不一样。

至于编译器为什么自作聪明这样做,我也不清楚。我使用gcc, sunWSCC,都是一样的结果。可能C的标准里面有说明吧!(没研究过)

建议看一下<<C专家编程>>这本书,看看数组和指针的区别,在静态数组上使用指针语义,有些时候是会导致错误的,很危险。
例如下面:
>cat lib.c  //库程序
int buf[];
>cat main.c //主程序
extern int* buf;
....
然后你使用buf就会导致程序崩溃。什么原因呢? 指针是2次跳转寻址,而静态数组是编译时决定了起始地址,只需要1次偏移地址跳转就可以了。编译没错,运行时发生错误。

呵呵

[ 本帖最后由 jeanlove 于 2009-3-23 18:28 编辑 ]

论坛徽章:
0
5 [报告]
发表于 2009-03-23 18:42 |只看该作者
一句话:arr 是数组,不是指针。

论坛徽章:
0
6 [报告]
发表于 2009-03-23 18:45 |只看该作者
原帖由 langue 于 2009-3-23 18:42 发表
一句话:arr 是数组,不是指针。

bz言简意赅,呵呵。

论坛徽章:
0
7 [报告]
发表于 2009-03-23 19:12 |只看该作者
数值与类型

论坛徽章:
0
8 [报告]
发表于 2009-03-23 20:20 |只看该作者
看看上面提到的c专家编程

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
9 [报告]
发表于 2009-03-23 20:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
1
黑曼巴
日期:2020-02-27 22:54:26
10 [报告]
发表于 2009-03-23 20:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP