考题GT(6)

2019-08-31 21:47

限制变量的作用域 设置变量的存储域

2.如何引用一个已经定义过的全局变量? 答:extern

可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个变写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错

3.全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么? 答:可以,在不同的C文件中以static形式来声明同名全局变量。

可以在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错

4.static全局变量与普通的全局变量有什么区别?static局部变量和普通局部变量有什么区别?static函数与普通函数有什么区别?

全局变量(外部变量)的说明之前再冠以static 就 构成了静态的全局变量。全局变量本身就是静态存储方式,静态全局变量当然也是静态存储方式。这两者在存储方式上并无不同。这两者的区别虽在于非静态全局变量的作用域是整个源程序,当一个源程序由多个源文件组成时,非静态的全局变量在各个源文件中都是有效的。而静态全局变量则限制了其作用域,即只在定义该变量的源文件内有效,在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内,只能为该源文件内的函数公用,因此可以避免在其它源文件中引起错误。

从以上分析可以看出,把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域,限制了它的使用范围。

static函数与普通函数作用域不同。仅在本文件。只在当前源文件中使用的函数应该说明为内部函数(static),内部函数应该在当前源文件中说明和定义。对于可在当前源文件以外使用的函数,应该在一个头文件中说明,要使用这些函数的源文件要包含这个头文件

static全局变量与普通的全局变量有什么区别:static全局变量只初使化一次,防止在其他文件单元中被引用;

static局部变量和普通局部变量有什么区别:static局部变量只被初始化一次,下一次依据上一次结果值; static函数与普通函数有什么区别:static函数在内存中只有一份,普通函数在每个被调用中维持一份拷贝。

其他

1. 头文件中的 ifndef/define/endif 干什么用? 答:防止头文件被重复引用。

2. p分别表示什么,有什么区别? char *p[5]; (3分) char (*p)[5]; (3分) 答: char *p[5];

指针数组,每一个元素都是指针变量。 p[0]~[5]分别表示5个指针变量。 char(*p)[5];

数组指针,它所指的对象,已经不是一个元素,而是整个一维数组。 p是指向一个一维数组的指针,该数组包含5个元素。 对指针数据和数据指针的定义要有清楚的认识。

3. 写出下列运算中变量x的值: int a = 3, b = 5, c, x; c = (a == b); x = c ? a:b; 答:5

4. 系统中哪些情况推荐使用系统自带的动态内存分配malloc()获取内存,哪些情况推荐使用OSS封装的内存UB获取函数得到内存?为什么?

答:上电后获取就不再释放的内存资源建议使用malloc,运行过程中动态获取并释放的内存建议使用oss封装函数。原因是防止造成内存碎片。

5. 用预处理指令#define 声明一个常数,用以表明1年中有多少秒(忽略闰年问题) 答:#define SECOND_PER_YEAR (60*60*24*365)UL(3)

6. 下面的代码段输出在32位BIG-ENDIAN和32位LITTLE-ENDIAN分别是多少? Unsigned int x = 0x123;

unsigned char *puch = (unsigned char *)&x;

printf(“%x,%x,%x,%x\\n”, puch[0],puch[1],puch[2],puch[3]); 答:

BIG-ENDIAN 情况下输出:0,0,1,23 LITTLE-ENDIAN情况下输出:23,1,0,0

由于不同的处理机的通用寄存器与内存之间交换数据时,内存的字节位置不一样。因此,获取内存字中字节的内容时,需要特别注意BIG-ENDIAN 和 LITTLE-ENDIAN之间的区别。

7. 假设int为4字节整数,求输出。 结构体 struct {char a; char b;}T; struct {char a; int b;}T1;

struct {char a; int b;char c;}T2; 那么sizeof(T)==? sizeof(T1)==? sizeof(T2)==?

答:四字节对齐。2,8,12。

8. 下面的代码输出是什么,为什么? void foo(void) {

unsigned int a = 6; int b = -20;

(a+b > 6) ? puts(\}

答:> 6,原因是无符号数和有符号数一起计算统一转成无符号数。

9. 求输出

void FuncB(char *p) {

p = \}

void main() {

char *ptr =\通讯\FuncB(ptr);

printf(\} 答:

被调用函数不能改变调用参数的值,值参是一个临时的空间。程序执行函数调用时,为值参分配临时的空间(堆栈或者寄存器中),将调用参数的内容拷贝到临时分配的空间中,然后执行被调用函数。 因此,函数调用返回时,指针参数ptr的内容没有发生变化。

10. 32位处理系统中,求输出 char str[] = “ZTE CORP”; char *p = str; int n; 问:

sizeof(str) = ? sizeof(p) = ? sizeof(n) = ? sizeof(*p)= ? 答:

如果是32位体系结构下: sizeof(str) = 9 sizeof(p) = 4

sizeof(n) = 4 sizeof(*p) = 1

分别表示,数组长度、指针长度、整型长度、指针指向类型的长度(字符)。

11. 写出程序运行的结果 main() {

int a[5]={1,2,3,4,5}; int *ptr=(int *)(&a+1);

printf(\} 答:2,5

说明:&a是数组指针,其类型为 int (*)[5];而指针加1要根据指针类型加上一定的值,不同类型的指针+1之后增加的大小不同,a是长度为5的int数组指针,所以要加 5*sizeof(int),所以ptr实际是a[5]。但是prt与(&a+1)类型是不一样的(这点很重要),所以prt-1只会减去sizeof(int*)。

a,&a的地址是一样的,但意思不一样,a是数组首地址,也就是a[0]的地址,&a是对象(数组)首地址,a+1是数组下一元素的地址,即a[1],&a+1是下一个对象的地址,即a[5].

12. 请问以下代码有什么问题 char* s=\printf(\s[0]='B'; printf(\答:

\是字符串常量。s是指针,指向这个字符串常量,所以声明s时就有问题。 cosnt char* s=\,然后又因为是常量,所以对s[0]的赋值操作是不合法的。

13. 程序找错

#include\main() {

char*src=\char* dest=NULL; int len=strlen(src); dest=(char*)malloc(len); char* d=dest; char* s=src[len]; while(len--!=0) d++=s--;

printf(\return 0; } 答: int main()

{

char* src = \ int len = strlen(src);

char* dest = (char*)malloc(len+1);//要为\\0分配一个空间 char* d = dest;

char* s = &src[len-1];//指向最后一个字符 while( len-- != 0 ) *d++=*s--;

*d = 0;//尾部要加\\0 printf(\

free(dest);//使用完,应当释放空间,以免造成内存汇泄露 return 0; }


考题GT(6).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:建筑施工企业工程成本及收入的核算

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: