C语言部分题目解析

来源:互联网 发布:c#数组去重的方法 编辑:程序博客网 时间:2024/05/01 05:25

C语言部分题目解析

1、有以下程序

#include <stdio.h>int main (){int i = 1, j = 2, k = 3;if (i++ ==1 || (++j == 3 || k++ == 3))printf(“%d%d%d\n”, i, j, k);return 0;}

答案:223

解析:|| 全假为假,有真即真  ,i++ == 1, 先取i与1比较,再自增,成立且+1为2,||后面不再计算

2char a[7] = “a0\0a0\0”;

sizeof (a) = 7;   数组字节数1 * 7 = 7

strlen (a) = 2;   计算有效长度,即第一个\0为止,且不计算\0

3、

#include<stdio.h>void f(int *x, int *y){   int *t;    t= x;    x= y;    y= t;}int main (){   int a[8] = {1, 2, 3, 4, 5, 6, 7, 8},i, *p, *q;    p= a;    q= &a[7];    while(p < q)    {       f(p, q);       p++;       q--;    }   for(i = 0; i < 8; i++)       printf("%d",a[i]);   return 0;}

答案:12345678

解析:调用函数f,只能改变形参地址,没有通过地址的解引用改变数组的值(可以通过画内存图分析)

4、

#include<stdio.h>int fun(int a){   int b = 0;    staticint c = 2;   b++;   c++;   return (a + b + c);}int main(){   int i,a = 5;   for (i = 0; i < 3; i++)       printf("%d%d",i,fun(a));   return 0;}

答案:09110211

解析:static int c = 2,静态变量,在内存的静态存储区,只初始化一次以后再次使用将使用上一次的值。i = 0, a = 5, b = 1, c = 3;  i= 1,a = 5, b = 1, c = 4;  i = 2, a = 5,b= 1, c = 5

5、

#include<stdio.h>#include <stdlib.h>  //free()#include <string.h>  //strlen()int main(){   char *src = "hello,world";   char *dest = NULL;   long len = strlen(src);   dest = (char *)malloc(len + 1); //strlen不计算'\0',malloc要加1   char *d = dest;   char *s = &src[len - 1];  //取最后一个元素地址   while (len-- != 0)    {       *d++ = *s--;  //解引用赋值    }   *(d + len + 1) = '\0';  //倒序赋值结束之后,*d后面加'\0',*d ='\0';    printf("%s,%ld\n",dest,sizeof(strlen(src)));   free(dest);  //释放开辟的堆空间   return 0;}

6、

#include<stdio.h>void main(){   int a = 1, b;   for(b = 1;b <= 10; b++)    {       if(a >= 8)           break;       if(a % 2 == 1)       {           a += 5;           continue;       }       a = 3;    }   printf("%d\n",b);}

答案:4

解析:b = 1, a = 1,进入循环,a += 5, a变成6,continue 结束本次循环进行下一次循环; b = 2,  a = 6, 第二次循环,a = 3,a变成3; b = 3, a = 3, 第三次循环,a +=5 , a变成 8; b = 4, a = 8 , 第四次循环,break,跳出循环

7、编程实现,删除字符串s中值为c的字符串

void Delchar(char s[] , char c){   int i, x, len;   len = strlen(s);   for (i = 0; i < len; i++)    {       if (s[i] == c)       {           for (x = i; s[x] != '\0'; x ++)                s[x] = s[x + 1];           len--;       }    }}

8、该程序有什么问题?

#include <stdio.h>#include <stdlib.h>void GetMemory(char **p, int num){   *p = (char *)malloc (num);}int main(){   char *str = NULL;   GetMemory(&str, 100);   strcpy(str, "hello");   printf("str1 is %s \n",str);   free(str);  //已经释放堆空间,虽然得到地址并可以进行修改,但是该块内存空间已经自由,不被原变量控制   if(str != NULL)    {       strcpy(str, "hello,Baby!");    }   printf("str3 is %s \n",str);}

9、该程序有什么问题?

#include <stdio.h>int main(){   char a;   char *s = &a;    strcpy(s,"hello");  //a是char类型,内存中占1个字节,s是char类型指针,它的值是a的地址,不能通过strcpy来对s赋值   printf("%s\n",s);    s= "hello2";  //可以通过这条语句,让s指向另外的“hello”   //*s = "hello3";   printf("%s\n",s);}

10、

#include  <stdio.h>int main(){   int a[5] = {1, 2, 3, 4, 5};   int *p = (int *)(&a + 1);   printf ("%p\n",a);   printf ("%p\n",&a);   printf ("%p\n",&a[0]);   printf ("%p\n",a+1);   printf ("%p\n",&a[1]);   printf ("%p\n",&a+1);   printf ("%p\n",p);   printf ("%p\n",&a[5]);   printf ("%p\n",&a[4]);   printf ("%p\n",p-1);   printf("%d, %d\n",*(a + 1),*(p - 1));}

答案:2, 5

解析:

0x7fff5fbff8c0  a的地址,即a[0]的地址

0x7fff5fbff8c0  &a

0x7fff5fbff8c0  a[0]的地址

0x7fff5fbff8c4  a的地址的下一个元素的地址

0x7fff5fbff8c4  a[1]的地址

0x7fff5fbff8d4  取整个数组a的地址再加1,p指向下一个a[5]的第一个元素

0x7fff5fbff8d4  p的地址

0x7fff5fbff8d4  a[5]的地址

0x7fff5fbff8d0  a[4]的地址

0x7fff5fbff8d0  p-1的地址

2, 5

11、

#include <stdio.h>intmain(){    int a = 2, b = 4;    int const c = 3;    const int *d = &a;    int *const e = &d;    int const * const f = &a;    *c = 32; //c是一个整型常量,不是指针,不能解引用    d = &b;    *d = 43; //d指向常量的指针,不能通过解引用改变值    e = 34;  //e是整形指针常量,一经初始化不能更改其值    e = &a;   //e是整形指针常量,一经初始化不能更改其值    f = &b;   //f和*f都不能更改}

 

0 0
原创粉丝点击