几个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
可以说明指针的强大功能,用好它你就可以访问内存中你想得到的大部分数据
[解决办法]
这么简单的问题都搞不懂
还编什么程序啊
回家
卖烤地瓜 得了