接下来给出剩下的几道题的答案!!!!
第四题:
main()
{
short *p, *q;
short ar[10]={0};
p = q = ar;
p++;
printf("%5d", p-q);
printf("%5d", (char*)p - (char*)q);
printf("%5d", sizeof(ar)/sizeof(*ar));
}
答案是:
1 2 10
我们要清楚两个指针变量相减的结果是什么?是这两个指针变量之间的元素的个数,因为第一个printf输出的是 :1
( char * )p - ( char * )q 表示的现将short int类型的指针通过强制转换为char类型的指针,但是这个并不能够改变开始的时候指针的值,也就是说通过强制类型转换的p和q的值是不变的,所以( char *)p - (char *)q的结果是2 。对于第三个printf输出的结果是10我觉得不用讲解了吧!!!!
第五题:
int sub(int a, int b)
{
return a-b;
}
main()
{
typedef int (*SUB)(int, int);
SUB psub=sub;
printf("%d", psub(10,(10,5)));
}
答案是:
5
可能有很多人好像至今还没有看见过这样程序,这个程序是什么意思呀??怎么就不懂呢呀???
没有关系,来我们一起来分析分析吧!
typedef int ( *SUB )( int , int );这段代码的意思是利用typedef定义了一个函数的指针。嗯????函数的指针??怎么没有听说过呢??看来我好得要讲解一下函数指针的问题了呀!!
其实在c语言中对于我们定义的每个函数都是有指针的,只不过我们很少会使用函数的指针来调用一个函数,虽然这样,但是函数确实是可以通过指针来调用的!!下面我们来看一下下面的这段代码吧:
typedef void ( *FunType )( int ,int );//定义一个函数的指针
void CallFun( int x ,int y );
int main()
{
.....
.....
FunType Fun ;
Fun = &CallFun ;//将该函数的指针赋值给FunType
( * Fun )( a , b );
......
}
这样我们就可以通过函数CallFun的指针来调用这个函数了!!!!!!
如果你明白了这个东西,那么第四题就很容易解决了!!!
所以答案是:5
第六题:
main()
{
char* pstrar[3];
int i;
for(i=1; i<3; i++)
{
pstrar[i]=" ";
}
strcpy(pstrar[1], "你好");
printf(pstrar[1]);
}
答案是:
是有错误的,错误在:strcpy(pstrar[1], "你好");
这道题的程序里有错误的,那么错误究竟在哪里呢??就在这条语句:strcpy(pstrar[1], "你好");为什么这条语句是错误的呢??问题就在于在for循环里将指针数组中的第二个和第三个元素赋予了一个指针值,这个指针值是指向一个字符串常量的首地址,我们都应该知道字符串常量是不允许修改的,也就是字符串常量在程序中是只读的,是无法对其进行修改的!!而这条语句却在试图修改一个字符串常量,所以是错误的!!!!
第七题:
main()
{
char *p1,*p2;
{
char* pchar;
char charar[] = "你好,世界";
pchar = "Hello,World!";
p1 = pchar;
p2 = charar;
}
printf(p1);
printf(p2);
}
答案是:
有错误,p1和p2指向空指针!
这道题我觉得不应该有什么问题,一个字符数组和一个字符串常量在都是在{}内定义的,也就是它们的作用域只限制在这个{}内部才有效!!!当程序运行到{}外部的时候会导致在{}内部定义的所有的变量都释放了内存空间,这样就导致了p1和p2开始指向的内存空间变为了空(NULL),所以这个程序是错误的!!!
这个是我以前给出的答案,可是有几位指出了我这道题给出的答案是错误的,这道题我给出的答案确实是错误的,在此将其他人给出的解释拷贝了在这里:
pchar = "Hello,World!";//字符串是静态分配的,p1什么可能指向空?
char charar[] = "你好,世界";//被释放后,p2最多算是野指针吧。p2= 0;这才叫指向空
charar[]是在函数里申请的数组,应该也只会在函数结束后里面的值才是不安全的,{。。。}作用域结束了对数组里的内容应该没影响。
希望大家好好看看,
希望不要再犯我开始时的错误了,同时非常感谢:
lintaoyn
等 级:黑侠
WDMfans
等 级:新手上路
这两位热心的朋友!!!!!
这样这七道题的答案就全部公布了,不知道你做的怎么样??如果你没有做出来几道题,那就应该好好的从新在看一下指针了呀!!!!
[ 本帖最后由 我菜119 于 2010-9-26 10:48 编辑 ]
第四题:
main()
{
short *p, *q;
short ar[10]={0};
p = q = ar;
p++;
printf("%5d", p-q);
printf("%5d", (char*)p - (char*)q);
printf("%5d", sizeof(ar)/sizeof(*ar));
}
答案是:
1 2 10
我们要清楚两个指针变量相减的结果是什么?是这两个指针变量之间的元素的个数,因为第一个printf输出的是 :1
( char * )p - ( char * )q 表示的现将short int类型的指针通过强制转换为char类型的指针,但是这个并不能够改变开始的时候指针的值,也就是说通过强制类型转换的p和q的值是不变的,所以( char *)p - (char *)q的结果是2 。对于第三个printf输出的结果是10我觉得不用讲解了吧!!!!
第五题:
int sub(int a, int b)
{
return a-b;
}
main()
{
typedef int (*SUB)(int, int);
SUB psub=sub;
printf("%d", psub(10,(10,5)));
}
答案是:
5
可能有很多人好像至今还没有看见过这样程序,这个程序是什么意思呀??怎么就不懂呢呀???
没有关系,来我们一起来分析分析吧!
typedef int ( *SUB )( int , int );这段代码的意思是利用typedef定义了一个函数的指针。嗯????函数的指针??怎么没有听说过呢??看来我好得要讲解一下函数指针的问题了呀!!
其实在c语言中对于我们定义的每个函数都是有指针的,只不过我们很少会使用函数的指针来调用一个函数,虽然这样,但是函数确实是可以通过指针来调用的!!下面我们来看一下下面的这段代码吧:
typedef void ( *FunType )( int ,int );//定义一个函数的指针
void CallFun( int x ,int y );
int main()
{
.....
.....
FunType Fun ;
Fun = &CallFun ;//将该函数的指针赋值给FunType
( * Fun )( a , b );
......
}
这样我们就可以通过函数CallFun的指针来调用这个函数了!!!!!!
如果你明白了这个东西,那么第四题就很容易解决了!!!
所以答案是:5
第六题:
main()
{
char* pstrar[3];
int i;
for(i=1; i<3; i++)
{
pstrar[i]=" ";
}
strcpy(pstrar[1], "你好");
printf(pstrar[1]);
}
答案是:
是有错误的,错误在:strcpy(pstrar[1], "你好");
这道题的程序里有错误的,那么错误究竟在哪里呢??就在这条语句:strcpy(pstrar[1], "你好");为什么这条语句是错误的呢??问题就在于在for循环里将指针数组中的第二个和第三个元素赋予了一个指针值,这个指针值是指向一个字符串常量的首地址,我们都应该知道字符串常量是不允许修改的,也就是字符串常量在程序中是只读的,是无法对其进行修改的!!而这条语句却在试图修改一个字符串常量,所以是错误的!!!!
第七题:
main()
{
char *p1,*p2;
{
char* pchar;
char charar[] = "你好,世界";
pchar = "Hello,World!";
p1 = pchar;
p2 = charar;
}
printf(p1);
printf(p2);
}
答案是:
有错误,p1和p2指向空指针!
这道题我觉得不应该有什么问题,一个字符数组和一个字符串常量在都是在{}内定义的,也就是它们的作用域只限制在这个{}内部才有效!!!当程序运行到{}外部的时候会导致在{}内部定义的所有的变量都释放了内存空间,这样就导致了p1和p2开始指向的内存空间变为了空(NULL),所以这个程序是错误的!!!
这个是我以前给出的答案,可是有几位指出了我这道题给出的答案是错误的,这道题我给出的答案确实是错误的,在此将其他人给出的解释拷贝了在这里:
pchar = "Hello,World!";//字符串是静态分配的,p1什么可能指向空?
char charar[] = "你好,世界";//被释放后,p2最多算是野指针吧。p2= 0;这才叫指向空
charar[]是在函数里申请的数组,应该也只会在函数结束后里面的值才是不安全的,{。。。}作用域结束了对数组里的内容应该没影响。
希望大家好好看看,
希望不要再犯我开始时的错误了,同时非常感谢:
lintaoyn
等 级:黑侠
WDMfans
等 级:新手上路
这两位热心的朋友!!!!!
这样这七道题的答案就全部公布了,不知道你做的怎么样??如果你没有做出来几道题,那就应该好好的从新在看一下指针了呀!!!!
[ 本帖最后由 我菜119 于 2010-9-26 10:48 编辑 ]
愿用余生致力编程