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、下面的两段代码有什么区别?

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

(2)struct 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;
}

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

  • 11
    点赞
  • 71
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值