免费注册 查看新帖 |

Chinaunix

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

指针数据类型问题 [复制链接]

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2007-07-27 10:29 |只看该作者 |倒序浏览
int main(){
        int a[3]={0};
        int **p;
        p=&a;
}
为何p=&a;在vs2005 下不能编译通过啊,显示错误为
cannot convert from 'int (*__w64 )[3]' to 'int **':em11:

论坛徽章:
0
2 [报告]
发表于 2007-07-27 10:33 |只看该作者
类型不同嘛

论坛徽章:
0
3 [报告]
发表于 2007-07-27 10:49 |只看该作者
原帖由 phy0077 于 2007-7-27 10:29 发表
int main(){
        int a[3]={0};
        int **p;
        p=&a;
}
为何p=&a;在vs2005 下不能编译通过啊,显示错误为
cannot convert from 'int (*__w64 )[3]' to 'int **':em11:



这就是数组与指针的一个差别.
int **p; p里面是一个地址,而该地址所指向的变量又是一个指针类型.
p = &a;虽然是让p指向了a的首地址, 但是a这个标识符的首地址里面的内容却是一个整数类型的. 按道理应该为指针类型的.
所以会出现问题. 用gcc编译会有warnning, 在运行时报段错误, 就是访问了不该访问的内存区域. 即以a[0]这个值为地址去进行访问.
关于这个内容在<C专家编程>第四章有讲解.

[ 本帖最后由 scutan 于 2007-7-27 12:14 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2007-07-27 11:35 |只看该作者
原帖由 scutan 于 2007-7-27 10:49 发表



这就是数组与指针的一个差别.
int **p; p里面是一个地址,而该地址所指向的变量又是一个指针类型.
p = &a;虽然是让p指向了a的首地址, 但是a这个标识符的首地址里面的内容却是一个字符类型的. 按道理应该 ...


那本书上是这样说的么?还是你记错了?

看书本质是要转换成自己理解的东东。

int main(){
        int a[3]={0}; // 首先要明白,a在这里就是一个地址。假定a的地址是0xbfc97c84,a+0 == a == 0xbfc97c84
        int **p;   
        p=&a; //好,p = &0xbfc97c84 = 0xbfc97c84 ,说有警告,那是编译器知道你可能要干傻事了
      //*p[0] = 1L;  //加上这个行么?答案是不行的,因为p[0] == *(p+0) ==*(p)== *(0xbfc97c84)==*(a+0) == a[0]==0(初始化的值)
                    //so, *p[0] == *(0) 我们知道指针通过是否为0x00来判断是否有效,好了,你准备把1L村到一个无效的指针中去,
                    //不幸的是,这个指针指向的地址是0x0,而操作系统不允许你忘0x0上存东西,所以。。。,如果在初始化的时候,
                   //你把a[0]初始化成一个合法的地址的话,我想加上这个应该是可以的。--这个没有测试过哈
  }

ps至于楼上说的是一个字符,我表示严重不同意阿

论坛徽章:
0
5 [报告]
发表于 2007-07-27 11:53 |只看该作者
原帖由 Jiangge 于 2007-7-27 11:35 发表


那本书上是这样说的么?还是你记错了?

看书本质是要转换成自己理解的东东。

int main(){
        int a[3]={0}; // 首先要明白,a在这里就是一个地址。假定a的地址是0xbfc97c84,a+0 == a == 0xbfc ...


在<C专家编程>中文版86页最上面的一段话, 你自己去看, 难道a这个地址里面的值不是一个整数类型吗?
还有, 如果说a[0]的值为一个地址的值, 当然可以进行强制转化去得到这个地址的内容, 但是你在写代码时,你怎么知道你程序会运行在哪个地址?
int **p, p所指向的难道不是一个整数指针么?
int a[3], a这个地址里面的内容难道不是一个整数类型么?
你让一个整数类型变成一个指针类型, 当然会出错.

[ 本帖最后由 scutan 于 2007-7-27 12:13 编辑 ]

论坛徽章:
0
6 [报告]
发表于 2007-07-27 12:04 |只看该作者
>> 这就是数组与指针的一个差别.

应该是指针与指针的类型上的差别。

&a 表达式的结果是一个类型为 int (*)[3] 的指针。程序错误是因为这种类型的指针转换为 int** 指针是非法的。

论坛徽章:
0
7 [报告]
发表于 2007-07-27 12:26 |只看该作者
原帖由 scutan 于 2007-7-27 11:53 发表


在中文版86页最上面的一段话, 你自己去看, 难道a这个地址里面的值不是一个字符类型吗?
还有, 如果说a[0]的值为一个地址的值, 当然可以进行强制转化去得到这个地址的内容, 但是你在写代码时,你怎么知道你程 ...



我看过那本书,只是忘了,但是:

p所指向的难道不是一个字符指针?

==,怎么p指向的是一个字符指针? 它指向的是一个指向(int*) 的指针,指针不管类型,一般占用机器的一个字长,比如X86,一般占4个字节,在Power(还是Alpha)中占8个字节,所以你说一个字符指针,实在无法理解

论坛徽章:
0
8 [报告]
发表于 2007-07-27 12:29 |只看该作者
原帖由 whyglinux 于 2007-7-27 12:04 发表
>> 这就是数组与指针的一个差别.

应该是指针与指针的类型上的差别。

&a 表达式的结果是一个类型为 int (*)[3] 的指针。程序错误是因为这种类型的指针转换为 int** 指针是非法的。


对,但不能说程序一定错误吧(只需强制转换),只是有编译器的不让你编译通过,有的只是警告,

[ 本帖最后由 Jiangge 于 2007-7-27 12:31 编辑 ]

论坛徽章:
0
9 [报告]
发表于 2007-07-27 12:31 |只看该作者
原帖由 Jiangge 于 2007-7-27 12:26 发表



我看过那本书,只是忘了,但是:

p所指向的难道不是一个字符指针?

==,怎么p指向的是一个字符指针? 它指向的是一个指向(int*) 的指针,指针不管类型,一般占用机器的一个字长,比如X86,一般占 ...


笔误笔误, 已更改.

论坛徽章:
0
10 [报告]
发表于 2007-07-27 12:34 |只看该作者
int a[3]={5};
int **p = &a;

a和&a的值是一样的,但是意义不一样
*&a   <===>   a
**&a <===>   a[0]

p得到&a的值之后,就将数组的意义完全抛弃了
*p在值上等于a[0]
**p   ===>  core dump (会以a[0]为地址去访问一块内存)

[ 本帖最后由 ypxing 于 2007-7-27 12:35 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP