C语言经典问题学习笔记之二
2017-05-05 14:05
351 查看
1.
请你谈谈引用和指针的区别。
【参考答案】
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。
(2)不能有
NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL) 。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。
2.
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
}会出现什么问题?
【标准答案】程序崩溃,getmemory中的malloc不能返回动态内存,即形参p是接收的str的地址,而在malloc的过程中,p的值发生了变化,而str的内容还是原来的NULL/
3.
charszstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
【标准答案】长度不一样,出现段错误。
4.
数组和链表的区别?
【标准答案】
数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变
5.
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。
6.
给定结构struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
问sizeof(A) = ?
【标准答案】8
7.
struct name1{
char str;
short x;
int num;
};
求sizeof(name1)?
【标准答案】8
8.
struct name2{
char str;
int num;
short x;
};求sizeof(name2)?
【标准答案】12
9.
程序哪里有错误
wap(
int*p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【标准答案】p为野指针
10.
(void*)ptr和(*(void**))ptr的结果是否相同?其中ptr为同一个指针。
【标准答案】(void*)ptr和(*(void**))ptr值是相同的
11.
要求设置一绝对地址为0x67a9的整型变量的值为0xaa66?
【标准答案】
int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa55;
*(int *
const)(0x67a9) = 0xaa55;
12.
要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000= 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
【标准答案】
*((void (*)( ))0x100000 ) ();
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
13.
inta,b,c请写函数实现c=a+b
,不可以改变数据类型,如将c改为long
int,关键是如何处理溢出问题
【标准答案】 bool
add (inta,
intb,int *c)
{
*c=a+b;
return (a>0 && b>0&&(*c<a || *c<b) || (a<0 && b<0&&(*c>a|| *c>b)));
}
14.
头文件中的ifndef/define/endif 干什么用?
【标准答案】防止该头文件被重复引用。
15.
关键字volatile有什么含意?并给出三个不同的例子。
【参考答案】
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)
3). 多线程应用中被几个任务共享的变量
16.
#include <filename.h>
和 #include “filename.h”
有什么区别?
【标准答案】对于#include <filename.h>
,编译器从标准库路径开始搜索filename.h ;
对于#include “filename.h” ,编译器从用户的工作路径开始搜索
filename.h。
17.
const 有什么用途?(请至少说明两种)
【标准答案】
(1)可以定义const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被
const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
18.
下面的声明都是什么意思?
constint a;
intconst a;
constint *a;
int *
const a;
intconst * a
const;
【标准答案】
两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。 第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的
19.
Heap与stack的差别。
标准答案】Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放
Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
20.
程序的局部变量存在于___中,全局变量存在于____中,动态申请数据存在于___中。
【标准答案】程序的局部变量存在于栈(stack)中,全局变量存在于静态数据区
中,动态申请数据存在于堆(heap)中。
21.
堆栈溢出一般是由什么原因导致的?
【标准答案】没有回收垃圾资源。
22.
队列和栈有什么区别?
【标准答案】队列先进先出,栈后进先出。
23.
用预处理指令#define
声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
【参考答案】#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
24.
用宏定义写出swap(x,y),即交换两数。
【标准答案】 #define swap(x, y)(x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
25.
写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
【标准答案】#defineMin(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;
26.
以下是求一个数的平方的程序,请找出错误:
#defineSQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
【标准答案】宏在预编译时会以替换的形式展开,仅仅会替换。涉及到宏的地方,不要用++ --,标准中对此没有规定,因此最终结果将会依赖于不同的编译器。执行程序的答案可能是25、也有可能是36。
27.
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a
的bit 3。在以上两个操作中,要保持其它位不变。
【标准答案】
#define BIT3 (0x1 <<3)
static inta;
void set_bit3(void) voidclear_bit3(void)
{ {
a |= BIT3; a &=~BIT3;
} }
28.
关键字volatile有什么含意?
【标准答案】提示编译器对象的值可能在编译器未监测到的情况下改变。
请你谈谈引用和指针的区别。
【参考答案】
(1)引用被创建的同时必须被初始化(指针则可以在任何时候被初始化) 。
(2)不能有
NULL 引用,引用必须与合法的存储单元关联(指针则可以是NULL) 。
(3)一旦引用被初始化,就不能改变引用的关系(指针则可以随时改变所指的对象) 。
2.
void getmemory(char *p)
{
p=(char *) malloc(100);
strcpy(p,“hello world”);
}
int main( )
{
char *str=NULL;
getmemory(str);
printf(“%s/n”,str);
free(str);
return 0;
}会出现什么问题?
【标准答案】程序崩溃,getmemory中的malloc不能返回动态内存,即形参p是接收的str的地址,而在malloc的过程中,p的值发生了变化,而str的内容还是原来的NULL/
3.
charszstr[10];
strcpy(szstr,"0123456789");
产生什么结果?为什么?
【标准答案】长度不一样,出现段错误。
4.
数组和链表的区别?
【标准答案】
数组:数据顺序存储,固定大小;
链表:数据可以随机存储,大小可动态改变
5.
void main()
{
char aa[10];
printf(“%d”,strlen(aa));
}
会出现什么问题?打印结果是是多少?
【标准答案】sizeof()和初不初始化,没有关系,strlen()和初始化有关,打印结果值未知。
6.
给定结构struct A
{
char t:4;
char k:4;
unsigned short i:8;
unsigned long m;
};
问sizeof(A) = ?
【标准答案】8
7.
struct name1{
char str;
short x;
int num;
};
求sizeof(name1)?
【标准答案】8
8.
struct name2{
char str;
int num;
short x;
};求sizeof(name2)?
【标准答案】12
9.
程序哪里有错误
wap(
int*p1,int* p2 )
{
int *p;
*p = *p1;
*p1 = *p2;
*p2 = *p;
}
【标准答案】p为野指针
10.
(void*)ptr和(*(void**))ptr的结果是否相同?其中ptr为同一个指针。
【标准答案】(void*)ptr和(*(void**))ptr值是相同的
11.
要求设置一绝对地址为0x67a9的整型变量的值为0xaa66?
【标准答案】
int *ptr;
ptr = (int*)0x67a9;
*ptr = 0xaa55;
*(int *
const)(0x67a9) = 0xaa55;
12.
要对绝对地址0x100000赋值,我们可以用
(unsigned int*)0x100000= 1234;那么要是想让程序跳转到绝对地址是0x100000去执行,应该怎么做?
【标准答案】
*((void (*)( ))0x100000 ) ();
首先要将0x100000强制转换成函数指针,即:
(void (*)())0x100000
然后再调用它:
*((void (*)())0x100000)();
13.
inta,b,c请写函数实现c=a+b
,不可以改变数据类型,如将c改为long
int,关键是如何处理溢出问题
【标准答案】 bool
add (inta,
intb,int *c)
{
*c=a+b;
return (a>0 && b>0&&(*c<a || *c<b) || (a<0 && b<0&&(*c>a|| *c>b)));
}
14.
头文件中的ifndef/define/endif 干什么用?
【标准答案】防止该头文件被重复引用。
15.
关键字volatile有什么含意?并给出三个不同的例子。
【参考答案】
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。下面是volatile变量的几个例子:
1). 并行设备的硬件寄存器(如:状态寄存器)
2). 一个中断服务子程序中会访问到的非自动变量(Non-automaticvariables)
3). 多线程应用中被几个任务共享的变量
16.
#include <filename.h>
和 #include “filename.h”
有什么区别?
【标准答案】对于#include <filename.h>
,编译器从标准库路径开始搜索filename.h ;
对于#include “filename.h” ,编译器从用户的工作路径开始搜索
filename.h。
17.
const 有什么用途?(请至少说明两种)
【标准答案】
(1)可以定义const 常量
(2)const可以修饰函数的参数、返回值,甚至函数的定义体。被
const修饰的东西都受到强制保护,可以预防意外的变动,能提高程序的健壮性。
18.
下面的声明都是什么意思?
constint a;
intconst a;
constint *a;
int *
const a;
intconst * a
const;
【标准答案】
两个的作用是一样,a是一个常整型数。
第三个意味着a是一个指向常整型数的指针(也就是,整型数是不可修改的,但指针可以)。 第四个意思a是一个指向整型数的常指针(也就是说,指针指向的整型数是可以修改的,但指针是不可修改的)。最后一个意味着a是一个指向常整型数的常指针(也就是说,指针指向的整型数是不可修改的,同时指针也是不可修改的
19.
Heap与stack的差别。
标准答案】Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放
Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
20.
程序的局部变量存在于___中,全局变量存在于____中,动态申请数据存在于___中。
【标准答案】程序的局部变量存在于栈(stack)中,全局变量存在于静态数据区
中,动态申请数据存在于堆(heap)中。
21.
堆栈溢出一般是由什么原因导致的?
【标准答案】没有回收垃圾资源。
22.
队列和栈有什么区别?
【标准答案】队列先进先出,栈后进先出。
23.
用预处理指令#define
声明一个常数,用以表明1年中有多少秒(忽略闰年问题)
【参考答案】#defineSECONDS_PER_YEAR (60 * 60 * 24 * 365)UL
24.
用宏定义写出swap(x,y),即交换两数。
【标准答案】 #define swap(x, y)(x)=(x)+(y);(y)=(x)–(y);(x)=(x)–(y);
25.
写一个“标准”宏,这个宏输入两个参数并返回较小的一个。
【标准答案】#defineMin(X, Y) ((X)>(Y)?(Y):(X))//结尾没有;
26.
以下是求一个数的平方的程序,请找出错误:
#defineSQUARE(a)((a)*(a))
int a=5;
int b;
b=SQUARE(a++);
【标准答案】宏在预编译时会以替换的形式展开,仅仅会替换。涉及到宏的地方,不要用++ --,标准中对此没有规定,因此最终结果将会依赖于不同的编译器。执行程序的答案可能是25、也有可能是36。
27.
给定一个整型变量a,写两段代码,第一个设置a的bit 3,第二个清除a
的bit 3。在以上两个操作中,要保持其它位不变。
【标准答案】
#define BIT3 (0x1 <<3)
static inta;
void set_bit3(void) voidclear_bit3(void)
{ {
a |= BIT3; a &=~BIT3;
} }
28.
关键字volatile有什么含意?
【标准答案】提示编译器对象的值可能在编译器未监测到的情况下改变。
相关文章推荐
- 学习笔记_你必须知道的495个C语言问题
- c++学习笔记(5.专题一经典问题解析)
- 2011/5/28操作系统学习笔记之经典同步问题
- [学习笔记]Java多线程经典问题
- 你必须知道的495个C语言问题-----学习笔记
- 【iOS学习笔记】c语言问题
- c++学习笔记(17.专题四经典问题解析)
- 操作系统学习笔记(10) 互斥和同步的经典问题
- 2011/5/28操作系统学习笔记之经典同步问题 【转】
- C++学习笔记10 经典问题解析
- [学习笔记]Java多线程经典问题
- 学习笔记---递归的代码,解决经典的汉诺塔问题
- 现代操作系统学习笔记-经典IPC问题
- C语言经典问题学习笔记之一
- 算法竞赛入门经典-学习笔记1(c语言)
- 【c语言学习笔记】指针数组和数组指针以及在做题的时候遇到的问题
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
- C语言学习笔记(1)main函数返回值问题
- c++学习笔记(13.专题三经典问题解析)
- C语言学习笔记之奇怪的地址问题