首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

几个C语言有关问题,详细解释

2012-03-07 
几个C语言问题,请教高手详细解释 1.voidfun5(){intarray[]{1,3,5,7,9}int*parrayintm,i,jm*(p+1)*(p

几个C语言问题,请教高手详细解释

1.
void   fun5()
{
int   array[]={1,3,5,7,9};
int   *p=array;
int   m,i,j;
m=*(p+1)*(p+1)[1];
i=*p++;
j=*p;
printf( "fun5   m=%d\ni=%d\nj=%d\n ",m,i,j);

}
//这条语句没有理解到他表达的意思;
若是*(p+1)     *   (p+1)[]   ,那么(p+1)[]表达什么呀,p+1也应该指向3吧
没有搞懂,请高手们指点下


2.
void   fun2()
{
struct   Ta{
unsigned   ba:1;
unsigned   bb:4;
unsigned   bc:5;
unsigned   bd:2;
};

struct   Tb{
unsigned   char   da;
unsigned   char   db;
};

union   Tu{
struct   Ta   *sa;
struct   Tb   *sb;
};

union   Tu   Tdata;
struct   Ta   *pTa;
struct   Tb   *pTb;

Tdata.sb-> da=0x10;
Tdata.sb-> db=0xF0;
pTa=Tdata.sa;
pTa-> ba=1;
pTa-> bc=2;
pTa-> bd=3;
pTb=Tdata.sb;
printf( "0x%x,0x%x,0x%x ",pTb-> da,pTb-> db,pTa-> bb);
}

请问下这Ta是什么结构体
这题怎么解?

3.
void   fun3()
{
char   *p1=(char*)1024;
        char   *p2;
p2=p1;
*p2=55;
printf( "%d,%d ",*p1,p2);
}

执行到这里报错*p2=55;




[解决办法]
1、m=*(p+1)*(p+1)[1];
第一个*是指向指针所存储的数据
第二个*是乘号,所以m的结果是15
i=*p++;
i = *p也就是1,然后p自增j=*p;那么j=3


[解决办法]
array[1]指array后的第1个地址,(p+1)[1]也是指p+1后面的第一个地址
[解决办法]
m=*(p+1)*(p+1)[1];

恒等式:a[1] = *(a+1)
所以
m=*(p+1)*(p+1)[1]
=p[1] * (*((p+1) + 1)
=p[1] * (*(p+2))
=p[1] * p[2]
= 3 * 5
= 15
[解决办法]
2.
void fun2()

函数的意思是TA,TB要占用一块地址
高0000[00][00 000][0000][0]低

--> da-0x10---00010000
高0000[00][00 000][1000][0]低

--> db-0xF0--11110000
--------------高1111[00][00 000][1000][0]低


--> ba 1-------------1
高1111[00][00 000][1000][1]低

--> bc 2------10
高1111[00][00 010][1000][0]低

--> bd 3---11
------高1111[11][00 000][1000][0]低

这样大家应该看明白了吧.
实际上这个函数内没定义Tb,Tb的变量,其所用的指针都是空悬的.


void fun3()
{
char *p1=(char*)1024; //把1024转换成一个地址
char *p2;
p2=p1;
*p2=55; //在1024地址处赋值.当然要出错啦,这是内核空间.
printf( "%d,%d ",*p1,p2);
}
[解决办法]
Tdata.sb-> da=0x10;
Tdata.sb-> db=0xF0;

这句话运行时会发生 Segmentation Fault
[解决办法]

a*20 --> (a < <4)+(a < <2)
a*60 --> (a < <6)-(a < <2)


位运算,a < < n 相当于 a *(2的n次方),

这样只需将乘数化解为 (2的 n 次方) 就OK了

解题过程; a*20 --> 20 = (2的4次方)+(2的2次方) --> a*20 相当于 (a < <4)+(a < <2)
a*60 --> 60 = (2的6次方)-(2的2次方) --> a*60 相当于 (a < <6)-(a < <2)
[解决办法]
对于3
可以说明指针的强大功能,用好它你就可以访问内存中你想得到的大部分数据


[解决办法]
这么简单的问题都搞不懂
还编什么程序啊
回家 
卖烤地瓜 得了

热点排行