一:填空(共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\n”, 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("\n [%s] \n", 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);//碰到‘\0’字符结束,源字符串作为后面的参数
5.(1分)在大端系统中,int类型的1内存中存储的是0x1在 高字节。//0x1 是低字节数据,在大端系统中存放在高字节内存中
6.(1分)有数组定义inta[2][3] = {{1}, {2,3}};则a[0][1]的值 为0.
对
7.(1分)声明函数int fun(int a[10]);则a表示一维数组变量名。错
一维数组做函数参数,数组名仅仅代表一个地址,不代表数组?怎么表述
8.(1分)char *p = “hello”, char str[] = “hello”;表示指针变量 p和str 都指向文字常量“hello”。//p指向文字常量区,而str指向栈区,系统在栈区分配了一段内存空间存放从文字常量去复制的字符串“hello”
9(1分)程序的局部变量都存放在栈中。静态局部变量在数据域中
10(1分)switch(c)语句中c可以是int, float, char, long 类型。//float 不可作为c放在switch()的小括号内
三:(36)语法及分析
1.(2分)写一个宏,求之中比较大的数:________.
#define MAX(a,b) (a>b) ? (a):(b);
2. (2分)写一个宏判断一个变量是不是无符号数:________.
#define SIGNED(val) (val<0) ? 1:((~val>=0)?0:1 )
3.(2分)下面的语句输出的结果是____c语言没有规定计算顺序,answer的值不定,*p = 4,在可移植操作系统中有什么问题___不同的编译平台_answer的值不定_(-5)___。
#include <stdio.h>
int *p = NULL;//
int func ( void ) {
static int counter = 1;//静态变量在循环函数里面只会被初始化一次
P = &counter;
return counter++;//先返回counter的值然后执行++操作
}
int main ( void ) {
int answer;
answer = func() - func()*func();
printf("%d, %d\n",answer, *p);
return 0;
}
4.(2分)下面函数定义有没有错误或者漏洞?如果有,如何修改?
#include <stdio.h>
void showArray( int array [10] ) {//数组指定大小没意义
int i;
for (i = 1; i< 10; i+=1)
if ( array[i] >10 )
printf("%d\n",array[i]);
}
5.(2分)下面函数定义有没有错误或者漏洞?如果有,为什么,如何修改?
int main()
{
char a[5];//长度太短
char *str = a;
strcpy(str,"hello");
printf(str);//双引号也是相当于一个字符串的首地址开始打印和指针一个效果
//printf (“%s\n”,str);
return 0;
}
6.(2分)请问下面的代码的输出结果是
#include <stdio.h>
int main ( void ) {
int i = 6;
int a[5] = {1,2,3,4,5};
char * p = (char * )(&a +1);//&a+1相当于指向了a数组的后面一个内存单元。因为p指向的内存单元存放的是char类型数,所以p-1指向a[4]的高字节
printf("%d, %d",*(a+1),*(p-1));//2 , 0
}
7.(2分)请问下面的代码的输出结果是
int main(){
int a[6],*i,*p=a,*t=a;
printf("qing shu ru shu ju:\n");
for(i=a;i<a+6;i++){
scanf("%d",i);
}
for(i=a;i<a+6;i++){
*p=*i+*t;
printf("%4d",*p);
}
}
输入:1 2 3 4 5 6
输出:2 3 4 5 6 7
8(2分)请问下面的代码的输出结果是
int main ( void ) {
unsigned int a = 6;
int b = - 20;
(a+b)>0?puts(">0"):puts("<=0");//类型转换
}
>0
9.(2分)
#define N 2
#define NTI(n) N*n + n
int sum = N * NTI(N + 1);
问sum为多少(12)。
10.(4分)写出下列程序输出结果( )
#include <stdio.h>
int count 1= 3;
int main()
{
int i, sum, count2 = 2;
for(i = 0, sum = 0; i < count2; i += 2,count2++) //2ci xp hr
{
static int count 3; //静态变量的定义语句只能执行一次 count3 = 4;
count3++;
if(i % 2 == 0)
{
extern int count1; //extern限定count1引用的是函数外部,或文件外部的同名变量。Int不可少,防止变量类型重置。
count1++;
sum += count1;
}
sum += count3;
}
printf("%d, %d\n", count2, sum);
return 0;
}
11.(6分)写出下列程序执行结果 ( )。(注,此处按行评判给分)
#include <stdio.h>
#include <string.h>
void func(char str[50])
{
printf("%d, %d\n", sizeof(str), strlen(str)); //4传过来一个指针,
9指向的字符串从指向的地方开始到结束的长度,不包括‘\0’
}
int main()
{
char stra[] = "HelloWorld"; //strlen(stra)10 sizeof(stra)=11;
数组名代表整个数组的长度。
char *strb = stra; //字符串数组可以直接赋给一个字符指针。
printf("%d, %d\n", sizeof(stra), sizeof(strb++));//11,4,sizeof()里面的表达式永不执行。
func(++strb); //4,9,先把strb变量的值加1,就是指向字符串中的e。
printf("%d, %d\n", sizeof(strb), strlen(strb++));//4,9
return 0;
}
12.(4分)写出下列程序输出结果(01209)
int func(int n)
{
int k = 1;
if(n > 0)
{
k += func(--n);
printf(“%d”, n);
k += func(--n);
}
return k;
}
int main()
{
int a = 3;
printf(“%d\n”, fun(a));
return 0;
} //
13.(4分)写出下列程序输出结果()
#include <stdio.h>
struct SC{int a,b,c;};
struct SD{int a,b,c,d;};
int main()
{
struct SC c1[] = {{3,0,0}, {4,0,0}, {5,0,0}, {6,0,0}};
struct SD *c2 = (struct SD*)c1 + 1;
printf("%d,%d,%d,%d\n",c2->a,c2->b,c2->c,c2->d); //0 0 5 0
return 0;
}