C语言基础测试题1

来源链接:https://blog.csdn.net/m0_38121874/article/details/80036849?utm_source=blogxgwz9

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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

答:输出“>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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

答:程序内存会出现异常,因为数组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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

答: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§);
printf("% d", sizeof(*p));
printf("\n");

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

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

system("pause");
return 0;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29

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

释:在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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

答:结果为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
  • 2
  • 3
  • 4

答:
(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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

答:代码(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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

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

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

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

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

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

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

答:代码(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", &amp;test2.c1);
printf("% p\n", &amp;test2.c2);
printf("% p\n", &amp;test2.s);
printf("% p\n", &amp;test2.i);

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

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40

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

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

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

 
 
  • 1

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;
}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

答:输出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
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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

释:
(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;

}

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值