1.指针的数组和指针的针的问题.2.union 问题
有俩个问题特向大家请教:
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




