一:填空(共28分)
1.(2分)struct AA{
char a;//0
char b[2];//1,2
short c;//4 5
int d; //8 9 10 12
};
请问sizeof(struct AA)是___12_结构体起始地址就是第一个成员的起始地址__。
2. (2分 )struct BB{
char a;//0
short b[2];//2,3,4,5
char c;//6
int d;//8,9,10,11
};
请问sizeof(struct BB)是___12___。
3. (6分)
int *p = NULL;
int main()
{
int i = 3;
static int a = 5;
int *p1= NULL;
p = &a;
*p = i;
p1 = (int *)malloc(5 *sizeof(int));
i++;
printf(“%d, %d ”, a, i);
return 0;
}
在32位系统中,内存分为:数据域,栈,堆等。则指针变量p,p1所指向的区域分别存储在(.data区),(堆区);变量 i,a分别存储于(栈区),(.data);printf打印的结果(3),(4);
栈区:函数参数,动态局部变量;
堆区:动态内存;
数据域:全局变量,和静态局部变量
文字常量区:常量字符串
程序代码区:函数体的二进制代码
4.(2分)const的用法,至少两种?
(1).修饰函数参数,表明这个参数不可更改。
(2).修饰普通变量,表明此变量不可更改。
(3).修饰指针变量。(详见博客const)
- (2分) static的用法,至少两种?
1限定变量的作用域 2.改变变量的生存期(存储域)
6.(4分)1)定义一个3列4行int类型元素数组;
int a[4][3];
2)一个指向函数的指针,该函数有一个void型 指针参数并返回一个void型指针;void*(p*)(void*);
7.(4分)32位系统中char*p = NULL;int a[10] = {0};假设 int a[10]变量的起始地址是0x10000;指针变量(本身)的地址是 0x20000;char *p = (char *)a; 则:
p+1值(0x10001);&p+1值:(0x20004);//p的地址的值加1
a+1值: (0x10004);
&a+1值: (0x10028);//&a相当于存放a 数组指针 的地址,指向该数组之后的空间
8.(2分)写出float x与“零值”的比较( if((x<0.000001)&&(x>-0.000001)) )。
9.(2分)使用宏定义写出int类型最大值。
#define INT ~(1<<(sizeof (int)*8-1))
#define INT_SIZE ((unsigned int)~0)>>1
10.(2分)以下程序是否有误,如果无误,请写出执行次数( 1)。
int x = -1;
do{
x = x * x;
}while(!x);
二:判断(共10分)
1(1分)#include<stdio.h>
int main(void) {
char *ptr = "Linux";
*ptr = 'T';
printf(" [%s] ", ptr);
return 0;
}.
程序输出 Tinux:
//字符串常量不可改变,段错误
2(1分)定义一个指针变量,该指针变量指向一个具有10个整型指针元素的数组是: int * array [10];
int*(*arry)[10];
3(1分)以下都是正确的标识符:Char, Short, If,CASE.
//标识符都是用户自己定义的,不能是系统定义的关键字,系统区分大小写
4(1分)有语句char str1[10],str2[10]={"china"};则能将字符 串china赋给数组str1的正确语句是strcpy(str2,str1)
strcpy(str1,str2);//碰到‘