1.#include <stdio.h>
char fun(char *c)
{
if(*c<='Z' && *c>='A')
{
*c-='A' - 'a';
}
return *c;
}
main()
{
char s[81],*p=s;
gets(s);
while(*p)
{
*p = fun(p);
putchar(*p);
p++;
}
printf(:\n");
}
若运行时从键盘上输入"OPEN THE DOOR"程序输出的结果是:"open the door"
这道题中fun函数就是将大写字母转变成小写字母,最主要的就fun函数中*c-='A' - 'a';就相当于*c=*c-('A'-'a');*c=*c+'a'-‘A’;即字符中的大写字母变小写。
2.下面两段代码中for循环分别执行了多少次?
(1)unsigned short i,j;
for(i = 0,j = 2;i!=j;i+=5,j+=7)
{}
(2)unsigned short i,j;
for(i = 3, j = 7;i!=j;i+=3,j+=7)
{}
unsigned short能表示216个数,其范围为0~216-1,j在i前2个位置,i以5的速度增长,j以7的速度增长,当增长到unsigned short表示的最大值又会返回0(以一个圈的形式循
环)开始重新走直到i,j相遇,所以就是7t - 5t + 2 = 2……16,所以为32767次,第二个类似 (7t + 7)-(5t - 3) = 2……16,所以为16383次。
3.以下程序运行后的输出结果是?
#include <stdio.h>
main()
{
int y = 1,x,a[]={2,4,6,8,10},*p;
p = &a[1];
for(x = 0; x < 3; x++)
{
y=y+*(p+x)
printf("%d\n",y);
}
}
本题通过语句"p = &a [1] 将指针变量p指向了存储单元a [1] ,即使得p [0]的值为4。然后通过3次for循环,所以x = 0时,*(p + x) = *p = a [l] =4所以y = 1 + 4 = 5;x = 1时,*(p + x) = *(p + l) = a [2] = 6,所以y = 5 + 6 = 11;x = 2时,*(p + x)= *(p + 2) = a [3] = 8,所以y = 11 + 8 = 19。
4.下面程序的输出是
#include <stdio.h>
int main()
{
static char *s[]={"black","white","pink","viole"};
char **ptr[]={s+3.s+2,s+1,s},***p;
p = ptr;
++p;
printf("%s",**p+1);
return 0;
}
首先s是一个指针数组,存的是字符串的首地址,char **ptr[] 是一个还是一个指针数组,不过是一个二级指针数组,存的是s这个数组中,每个元素的地址p是一个三级指针,ptr
这个二级指针数组的数组名也是一个三级指针,p++只是往后跳了一个元素的位置,*p就是第二个元素的内容,也就是指向s数组中s+3这个元素的地址,**p就得到了s数组中s+3
这个元素的内容, s数组中保存的是字符串的首地址,那就得到了"pink"这个元素的首地址,在**p+1就是这个地址向后偏移一个字节,也就指到了'i'上,所以 **p+1还是"ink"。
5.若有定义语句:char s[3][10],(*k)[3],*p;则以下赋值语句错误的是
(1)p = s;
(2)p = k;
(3)p = s[0];
(4)k = s;
主要就是要弄清楚s,k,p是什么意思。
s是指向一维数组的常量指针,数组包含10个元素。k是指向一维数组的变量指针,数组包含3个元素。而p是指向单个变量的指针。如果一个变量算一个单位长,那么s+1就意
味着指针走了10个单位长,k+1就意味着走了3个单位长,p+1就意味着走了1个单位长。
指针不仅仅是地址,它还包括它所指向的类型,这样才能知道下一步它自己要走多长。 所以(2)(3)(4)错误。