C語言部分題目解析

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都不能更改
}

 

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章