1.写出输出结果

    1. #include <iostream>
    2. using namespace std;
    3. void g(int** p);
    4. int main()
    5. {
    6. int line[10], i;
    7. int *p = line; //p 是地址的地址
    8. for (i = 0; i < 10; i++)
    9. {
    10. *p = i;
    11. g(&p);//数组对应的值加1
    12. }
    13. for (i = 0; i < 10; i++)
    14. printf("%d\n", line[i]);
    15. return 0;
    16. }
    17. void g(int** p)
    18. {
    19. (**p)++;
    20. (*p)++;// 无效
    21. }

    image.png

    2.写出程序运行结果

    1. #include <iostream>
    2. using namespace std;
    3. int sum(int a)
    4. {
    5. auto c = 0;
    6. static int b = 3;
    7. c += 1;
    8. b += 2;
    9. return(a + b + c);
    10. }
    11. void main()
    12. {
    13. int I;
    14. int a = 2;
    15. for (I = 0; I < 5; I++)
    16. {
    17. printf("%d,", sum(a));
    18. }
    19. }

    image.png

    3.评价代码

    1. int func(int a)
    2. {
    3. int b;
    4. switch (a)
    5. {
    6. case 1: 30;
    7. case 2: 20;
    8. case 3: 16;
    9. default: 0;
    10. }
    11. return b;
    12. }

    则 func(1)=? 答:b没有赋值,所以不知道是什么。

    1. int a[3];
    2. a[0]=0;
    3. a[1]=1;
    4. a[2]=2;
    5. int *p, *q;
    6. p=a;
    7. q=&a[2];

    则 a[q-p]=a[2] 解析:指针一次移动一个 int 但计数为1

    4.请问一下程序将输出什么结果?

    1. char *RetMenory(void)
    2. {
    3. char p[] = hellow world”;
    4. return p;
    5. }
    6. void Test(void)
    7. {
    8. char *str = NULL;
    9. str = RetMemory();
    10. printf(str);
    11. }

    解析:RetMenory 执行完毕,p 资源被回收,指向未知地址。返回地址,str 的内容应是不可预测的, 打印的应该是 str 的地址。

    5.写出输出结果

    1. #include <iostream>
    2. using namespace std;
    3. typedef struct
    4. {
    5. int a : 2;
    6. int b : 2;
    7. int c : 1;
    8. }test;
    9. int main()
    10. {
    11. test t;
    12. t.a = 1;
    13. t.b = 3;
    14. t.c = 1;
    15. printf("%d", t.a);
    16. printf("%d", t.b);
    17. printf("%d", t.c);
    18. return 0;
    19. }

    image.png
    解析:t.a 为01,输出就是 1
    t.b 为11,输出就是 -1
    t.c 为1,输出也是 -1 。3个都是有符号数 int

    6.对下面程序进行分析

    1. void test2()
    2. {
    3. char string[10], str1[10];
    4. int i;
    5. for (i = 0; i < 10; i++)
    6. {
    7. //str1不能在数组内结束:因为 str1的存储为:{a,a,a,a,a,a,a,a,a,a},没有'\0'(字符串结束符),所以不能结束
    8. str1[i] = 'a';
    9. }
    10. strcpy(string, str1);
    11. //扫描 s2指向的内存,逐个字符付到 s1所指向的内存,直到碰到'\0',因为 str1结尾没有'\0',所以具有不确定性。
    12. }

    正确如下:

    #pragma warning(disable : 4996)
    #include <iostream>
    using namespace std;
    void test2()
    {
    
    }
    
    int main()
    {
        char string[10], str1[10];
        int i;
        for (i = 0; i < 9; i++)
        {
            str1[i] = 'a' + i; //把 abcdefghi 赋值给字符数组
        }
        str1[i] = '\0';//加上结束符
        strcpy(string, str1);
        printf("%s\n", str1);
        printf("%s\n", string);
        return 0;
    }
    

    image.png

    7.分析

    #include <iostream>
    using namespace std;
    
    int main()
    {
        int arr[] = { 6,7,8,9,10 };
        int *ptr = arr;
        *(ptr++) += 123;
        printf("%d %d ", *ptr, *(++ptr));
        return 0;
    }
    

    image.png
    解析:对于(ptr++) += 123;先做 6 + 123 = 129;然后再做ptr++,指向7;
    对于printf(“%d %d “,
    ptr, *(++ptr));从后往前执行,指针先做++,指向8,然后再输出8,紧接着再输出8;

    8.分析下面代码

    char *a = "hello";
    char *b = "hello";
    if(a == b)
    printf("YES");
    else
    printf("NO");
    

    解析:这个简单的面试题目,我选输出 no(对比的应该是指针地址吧),可在 VC 是 YES 在 C 是 NO;lz 的呢,是一个常量字符串。位于静态存储区,它在程序生命期内恒定不变。如果编译器优化的话,会有可能 a 和 b 同时指向同一个 hello 的。则地址相同。如果编译器没有优化,那么就是两个不同的地址,则不同

    9.写出输出结果

    #include<iostream>
    void foo(int m, int n)
    {
        printf("m = %d, n = %d\n", m, n);
    }
    int main()
    {
        int b = 3;
        foo(b += 3, ++b);
        printf("b = %d\n", b);
        return 0;
    }
    

    image.png

    10.找出错误

    #include string.h
    main(void)
    {
        char *src = "hello, world";
        char *dest = NULL;
        dest = (char *)malloc(strlen(src));
        int len = strlen(str);
        char *d = dest;
        char *s = src[len];
        while (len- != 0)
            d++ = s- ;
        printf("%s", dest);
    }
    
    //一共有4个错误;   
    int main()   
    {   
     char* src = "hello,world";   
     int len = strlen(src);   
     char* dest = (char*)malloc(len+1);//要为分配一个空间    
      char* d = dest;   
     char* s = &src[len-1];          //指向最后一个字符  
     while( len-- != 0 )   
      *d++=*s--;   
     *d = '\0';           //尾部要加’\0’   
     printf("%sn",dest);    
        free(dest);        // 使用完,应当释放空间,以免造成内存汇泄露
        dest = NULL;        //防止产生野指针 
        return 0;  
     }