C语言基础测试题1

1、下面的代码输出是多少?为什么?

#include<stdio.h>
#include<stdlib.h>

void foo(void)
{
    unsigned int a = 6;
    int b = -20;
    (a + b > 6) ? puts(">6") : puts("<6");
}

int main()
{
    foo();
    printf("\n");
    system("pause");
    return 0;
}

答:输出6,因为a+b进行了隐形转换,将int类型转换为unsigned int类型,编译器将b转换成一个很大的数。

2、下面的代码有什么问题?为什么?

#include<stdio.h>
#include<stdlib.h>

void foo(void)
{
    char string[10], str1[10];
    int i;
    for (i = 0; i < 10; i++)
    {
        str1[i] = 'a';
    }
    strcpy(string, str1);
    printf("%s", string);
}

int main()
{
    foo();
    printf("\n");
    system("pause");
    return 0;
}

答:程序内存会出现异常,因为数组str1中保存的都是字符‘a’,而字符串函数(strcpy)遇到结束字符‘\0’才会停止,否则将一直工作下去,这样就会使内存出现异常。

3、下面的代码,i和j的值分别是多少?为什么?

#include<stdio.h>
#include<stdlib.h>

static int i;

void fun1(void)
{
    i = 0;
    i++;
}

void fun2(void)
{
    static int j = 0;
    j++;
}

int main()
{
    for (int k = 0; k < 10; k++)
    {
        fun1();
        fun2();
    }
    system("pause");
    return 0;
}

答:i为1,j为10。因为static修饰的局部变量,变量值存放在静态区,即使函数执行结束,变量值依然存在。所以,在此程序中j只被初始化一次,每次循环都加1,所以j等于10;而i被初始化10次,每次初始值为0,然后执行i++,所以i等于1。

4、下面代码里,假设在32位系统下,各sizeof计算的结果分别是多少?

#include<stdio.h>
#include<stdlib.h>

int b[100];
void fun(int b[100])
{
    printf("% d", sizeof(b));
}

int main()
{
    int *p = NULL;
    printf("% d", sizeof(p));
    printf("% d", sizeof(*p));
    printf("\n");

    int a[100];
    printf("% d", sizeof(a));
    printf("% d", sizeof(a[100]));
    printf("% d", sizeof(&a));
    printf("% d", sizeof(&a[0]));
    printf("\n");

    fun(a[100]);
    printf("\n");

    system("pause");
    return 0;
}

运行结果为:
这里写图片描述

释:在C语言中,当一维数组做函数参数时,编译器会把它当做数组首元素地址的指针。
如果想更多的了解siezof和strlen的计算,请点击数组的计算http://blog.csdn.net/m0_38121874/article/details/71056821

5、下面代码的结果是多少?为什么?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    signed char arr[1000];
    int i;
    for (i = 0; i < 1000; i++)
    {
        arr[i] = -1 - i;
    }
    printf("% d\n", strlen(arr));
    system("pause");
    return 0;
}

答:结果为255。当遇到字符串函数时,就应该考虑’\0’在什么地方出现。如,在有符号字符数组(占1个字节)首元素arr[0]=-1时,其原码为1000 0001,反码为1111 1110,补码为1111 1111,即为0xff;arr[1]=-2时,补码为0xfe,以此类推。若补码为0(0000 0000),则反码为补码减1得1111 1111,那么原码为1 0000 0000,其十进制数为-256,数组下标为255。因为strlen求字符串长度时,其长度不包括‘\0’,所以strlen(arr)为255。

6、下面的代码里,哪些内容可被改写?哪些不可被改写?

(1)const int *p;
(2)int const *p;
(3)int * const p;
(4)const int * const p;

答:
(1)p可变,p指向的对象不可变;
(2)p可变,p指向的对象不可变;
(3)p不可变,p指向的对象可变;
(4)p不可变,p指向的对象也不可变。

7、下面的两段代码有什么区别?什么时候需要使用代码(2)?

代码(1)
int i = 10;
int j = i;
int k = i;

代码(2)
volatile int i = 10;
int j = i;
int k = i;

答:代码(1)中,i被初始化赋值为10,保存在内存中。当将i赋值给j时,编译器会生成汇编代码从内存中取出i值;如果i此时不为左值,当将i赋值给k时,编译器将不生成汇编代码,直接将i值赋给k。这样,可提高效率。
但是在代码(2)中,定义了i值为易变变量,每次用到i值时,编译器都会生成汇编代码从内存中提取i值。这样,可以保证了对特殊变量的稳定访问,如:端口数据,寄存器变量和多线程共享数据。

8、在32位的x86系统下,输出的值为多少?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int a[5] = { 1, 2, 3, 4, 5 };
    int *ptr1 = (int*)(&a + 1);
    int *ptr2 = (int*)((int)a + 1);
    printf("%x, %x\n", ptr1[-1], *ptr2);
    system("pause");
    return 0;
}

运行结果:
这里写图片描述

9、0x01<<2+3的值是多少?为什么?
答:值为32,因为算术运算符的优先级比移位优先级高。

10、定义一个函数宏,求x的平方。
答:“#define SQR(x) ((x)*(x))”。注意:定义一个宏时要把括号加上。

11、下面的两段代码有什么区别?

1struct test1
{
    char c1;
    short s;
    char c2;
    int i;
};

(2struct test2
{
    char c1;
    char c2;
    short s;
    int i;
};

答:代码(1)占用12个字节,代码(2)占用8个字节。

注:两段代码在内存中的匹配关系如下图所示:
这里写图片描述

#include<stdio.h>
#include<stdlib.h>

struct test1
{
    char c1;
    short s;
    char c2;
    int i;
};

struct test2
{
    char c1;
    char c2;
    short s;
    int i;
};

int main()
{
    struct test1 test1;
    struct test2 test2;
    printf("% d", sizeof(test1));
    printf("% d\n", sizeof(test2));
    printf("% p\n", &test1.c1);
    printf("% p\n", &test1.s);
    printf("% p\n", &test1.c2);
    printf("% p\n", &test1.i);
    printf("\n");

    printf("% p\n", &test2.c1);
    printf("% p\n", &test2.c2);
    printf("% p\n", &test2.s);
    printf("% p\n", &test2.i);

    printf("\n");
    system("pause");
    return 0;
}

运行结果:
这里写图片描述

12、写代码向内存0x12ff7c地址上存入一个整型数0x100。

答:int *p = (int*)0x12ff7c; *p = 0x100;或int *(int*)0x12ff7c = 0x100

13、下面代码的值是多少?

#include<stdio.h>
#include<stdlib.h>

int main()
{
    int arr[5] = { 1, 2, 3, 4, 5 };
    int *ptr = (int *)(&arr + 1);
    printf("% d, % d\n", *(arr + 1), *(ptr - 1));
    system("pause");
    return 0;
}

答:输出2和5。

14、假设p的值为0x100000,如下表达式的值分别是多少?

#include<stdio.h>
#include<stdlib.h>

struct Node
{
    int num;
    char *pcname;
    short sDate;
    char ch[2];
    short sBa[4];
}*p;

int main()
{
    struct Node pnode;
    struct Node *p;
    p = 0x100000;
    printf("%d\n", sizeof(pnode));
    printf("%x\n", p + 0x1);
    printf("%x\n", (unsigned int)p + 0x1);
    printf("%x\n", (unsigned int*)p + 0x1);

    system("pause");
    return 0;
}

运行结果:
这里写图片描述

释:
(1)结构体test占用的内存是20个字节,其中p=0x100000。
(2)p + 0x1 = 0x100000 + sizeof(pnode) * 0x1 = 0x100000 + 20d = 0x100014;
(3)(unsigned int)p + 0x1 = 0x100000 + (unsigned int)0x1 = 0x100001;
(4)(unsigned int*)p + 0x1 = 0x100000 + (unsigned int*) * 0x1 = 0x100004。

15、下面的代码输出的结果是多少?

#include<stdio.h>
#include<stdlib.h>

int main(int argc, char *argv[])
{
    int arr1[3][2] = { ( 0, 1 ), (2, 3), (4, 5) };
    int arr2[3][2] = { 0, 1, 2, 3, 4, 5 };

    int *p1;
    int *p2;

    p1 = arr1[0];
    p2 = arr2[0];

    printf("% d", p1[0]);
    printf("% d", p1[1]);
    printf("% d", p1[2]);
    printf("% d\n", p1[3]);

    printf("% d", p2[0]);
    printf("% d", p2[1]);
    printf("% d", p2[2]);
    printf("% d\n", p2[3]);

    system("pause");
    return 0;
}

运行结果:
这里写图片描述

猜你喜欢

转载自blog.csdn.net/m0_38121874/article/details/80036849