CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
可用分押宝游戏火热进行中... 专题改版:Java Web 专题
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  C/C++ >  C++ 语言

1.指针的数组和指针的针的问题.2.union 问题

楼主James_ht(顺风飞扬)2005-08-01 12:55:39 在 C/C++ / C++ 语言 提问

有俩个问题特向大家请教:  
  1.  
  int   L[]={2,1,23,5,47,83,10,50};  
  const   int   *pconst;  
  pconst=L;  
  以上可以执行.  
        char   *name[]={"aaa","bbb","ccc","ddd"};  
        const   char   **p;  
        p=name;    
    以下出现编译错误.  
    error   C2440:   '='   :   cannot   convert   from   'char   *[4]'   to   'const   char   **   '  
  请问,是不是指针数组char   *name[]中的地址是const,这个**p也应该为const.  
   
  2.  
  union   A  
  {  
  struct   B  
  {  
  char   e;  
  short   f;  
  int   g;  
  };  
  long   a;  
  B   b;  
  short   c[2];  
  };  
  A   a4;  
  a4.a=66560;  
  printf("a4.b.e=%d\n",a4.b.e);  
  printf("a4.b.f=%d\n",a4.b.f);  
  printf("a4.b.g=%d\n",a4.b.g);  
  printf("a4.c[0]=%d\n",a4.c[0]);  
  printf("a4.c[1]=%d\n",a4.c[1]);  
  printf("a4.a=%d\n",a4.a);  
  //输出.  
                  a4.b.e=0     //这里为什么输出为0.如果我把a4.a=10.则这里输出10  
  a4.b.f=1     //这里为什么输出为1.如果我把a4.a=10.则这里输出0  
                  a4.b.g=-858993460   //?  
                  a4.c[0]=1024           //?  
                  a4.c[1]=1             //?  
                  a4.a=66560           //? 问题点数:30、回复次数:7Top

1 楼trackant(蚁迹寻踪)回复于 2005-08-01 13:22:17 得分 10

a=66560=65536+1024=00010400H  
  ==>  
  struct   B  
  {     char     e;   (offset=0,value=00H)  
        (地址对齐,此处衬垫8bit;   value=04H)  
        short   f;   (offset=16,value=0001H)  
        int       g;   (offset=32,value=垃圾)  
  }Top

2 楼trackant(蚁迹寻踪)回复于 2005-08-01 13:28:12 得分 0

补充一下,你所用的编译器中char为8bit,short为16bit,long为32bit或更多。Top

3 楼lanting918(做人,要厚道!)回复于 2005-08-01 13:33:01 得分 0

以下出现编译错误.  
    error   C2440:   '='   :   cannot   convert   from   'char   *[4]'   to   'const   char   **   '  
   
  类型不同  
  一个使     char   *   []    
    一个是     char   **Top

4 楼fujingn188()回复于 2005-08-01 13:43:39 得分 5

name是一个指针,p是一个常量指针他不能修改指针指向的值,p=name,意味着可以通过name指针去修改p指向的值,所以会出现这样的报错.Top

5 楼boxban(冻酸梨)回复于 2005-08-01 14:39:10 得分 8

1.   const   char**   p   =   &name[0];   编译错误与const修饰符无关  
  2。trackant(蚁迹寻踪)   正解!  
  另外需要说明的是:   在Intel架构下,多字节整数的内存结构为“低字节在前,高字节在后,即little-endian”。  
  例如,对于int   x   =   0x11223344,则从&x开始的低地址到高地址依次存放:0x44,0x33,0x22,0x11  
  而在某些硬件平台上,则采用与此恰恰相反的内存结构,即“big-endian”,在这种结构下,各地址存放的字节分别为:0x11,   0x22,   0x33,   0x44。  
  显然,在不同的硬件平台上,楼主得到的结果会有所不同。Top

6 楼megaboy(飞天御剑流之杀神一刀斩)回复于 2005-08-01 18:26:41 得分 5

第一个问题:  
   
  这个问题跟const是直接相关的。C89规定,左值必须包含右值全部限定符。对于pconst=L来说,这是符合规定的。但是,对于指针,这种符合只限定在一重指针,对多重指针不适用,因为即使符合规定,多重指针仍然会发生const值被修改的情况,下面我举一例:  
   
  const   int   **   p1;  
  int   *   p2;  
  const   int   i=20;  
  p1=&p2;                       //这一条,多数编译器会发出一个警告,在这里我假设成立  
  *p1=&i;  
  *p2=10;  
  printf("%d",i);  
   
  现在你会发现,虽然p1包含了p2所有的限定词,但作为const的i的值还是被修改了。因此,为了防止这种情况的发生,不少编译器对带有const的多重指针,即使它符合C89的赋值规则,也不接受把没有const的地址赋予它。  
   
  第二个问题,是字节对齐的问题,trackant(蚁迹寻踪)已经说完了。Top

7 楼mayflowers(黯然神伤)回复于 2005-08-03 15:00:37 得分 2

Support   trackant(蚁迹寻踪)   .   :)Top

相关问题

  • 数组指针与指针数组
  • 指针与数组
  • 指针和数组
  • 数组和指针
  • 指向数组的指针数组……
  • 字符串指针数组
  • ……有关数组指针……
  • 关于指针和数组
  • 指针与数组问题
  • 指针数组问题!

关键词

  • 指针
  • 编译器
  • 编译
  • 修改
  • 结构
  • a4
  • pconst
  • trackant
  • 输出
  • 问题

得分解答快速导航

  • 帖主:James_ht
  • trackant
  • fujingn188
  • boxban
  • megaboy
  • mayflowers

相关链接

  • C/C++ Blog
  • C/C++类图书
  • C/C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
世纪乐知(北京)网络技术有限公司 版权所有, 京 ICP 证 020026 号
北京创新乐知广告有限公司 提供技术支持
Copyright © 2000-2007, CSDN.NET, All Rights Reserved
GongshangLogo