1、局部变量能否和全局变量重名?
答:能,局部会屏蔽全局。局部变量可以与全局变量同名,在函数内引用这个变量时,会用到同名的局部变量,而不会用到全局变量。对于有些编译器而言,在同一个函数内可以定义多个同名的局部变量,比如在两个循环体内都定义一个同名的局部变量,而那个局部变量的作用域就在那个循环体内。
2、如何引用一个其它文件已经定义过的全局变量?
答:可以用引用头文件的方式,也可以用extern关键字,如果用引用头文件方式来引用某个在头文件中声明的全局变理,假定你将那个编写错了,那么在编译期间会报错,如果你用extern方式引用时,假定你犯了同样的错误,那么在编译期间不会报错,而在连接期间报错。
3、用变量a给出下面的定义
a) 一个整型数b)一个指向整型数的指针c)一个指向指针的的指针,它指向的指针是指向一个整型数d)一个有10个整型数的数组e) 一个有10个指针的数组,该指针是指向一个整型数的f) 一个指向有10个整型数数组的指针g) 一个指向函数的指针,该函数有一个整型参数并返回一个整型数h) 一个有10个指针的数组,该指针指向一个函数,该函数有一个整型参数并返回一个整型数
3、用变量a给出下面的定义_续
答案是:
a) int a; // An integer
b) int *a; // A pointer to an integer
c) int **a; // A pointer to a pointer to an integer
d) int a[10]; // An array of 10 integers
e) int *a[10]; // An array of 10 pointers to integers
f) int (*a)[10]; // A pointer to an array of 10 integers
g) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integer
h) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer
a) int a; // An integer
b) int *a; // A pointer to an integerc) int **a; // A pointer to a pointer to an integerd) int a[10]; // An array of 10 integerse) int *a[10]; // An array of 10 pointers to integersf) int (*a)[10]; // A pointer to an array of 10 integersg) int (*a)(int); // A pointer to a function a that takes an integer argument and returns an integerh) int (*a[10])(int); // An array of 10 pointers to functions that take an integer argument and return an integer 指针的数据类型定义含义int i; 定义×××变量iint *p; p为指向×××数据的指针变量int a[n]; 定义×××数组a, 它有n个元素int *p[n]; 定义指针数组p, 它由n个指向×××数据的指针元素组成int (*p)[n]; p为指向含n个元素的一维数组的指针变量int f(); f为带回×××函数值的函数int *p(); p为带回一个指针的函数,该指针指向×××数据int (*p)(); p为指向函数的指针,该函数返回一个×××值int **p; p是一个指针变量,它指向一个指向 ×××数据的指针变量4、关键字static的作用是什么?
1)在函数体,一个被声明为静态的变量在这一函数被调用过程中维持其值不变。
2) 在模块内(但在函数体外),一个被声明为静态的变量可以被模块内所用函数访问,但不能被模块外其它函数访问。它是一个本地的全局变量。
3) 在模块内,一个被声明为静态的函数只可被这一模块内的其它函数调用。那就是,这个函数被限制在声明它的模块的本地范围内使用。
5、关键字const有什么含意?
const意味着“只读”。另外,const可以使编译器很自然地保护那些不希望被改变的变量或参数(用const修饰),防止其被无意的代码修改。
下面的声明都是什么意思?
const int a;
int const a;
const int *a;
int * const a;
int const * a const;
6、关键字volatile有什么含意?
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份。
1) 并行设备的硬件寄存器(如:状态寄存器);
2) 一个中断服务子程序中会访问到的非自动变量(Non- automatic variables);
3) 多线程应用中被几个任务共享的变量。
7、全局变量可不可以定义在可被多个.C文件包含的头文件中?为什么?
可以,在不同的C文件中以static形式来声明同名全局变量。在不同的C文件中声明同名的全局变量,前提是其中只能有一个C文件中对此变量赋初值,此时连接不会出错。
8、设有以下说明和定义:
typedef union{
long i;
int k[5];
char c;
} DATE;
struct data{
int cat;
DATE cow;
double dog;
} too;
DATE max;
则语句printf("%d",sizeof(struct data)+sizeof(max));的执行结果是:___
9、请找出下面代码中的所有错误(说明:以下代码是把一个字符串倒序,如“abcd”倒序后变为“dcba”)
#include"string.h"
int main(){
char*src="hello,world";
char* dest=NULL;
intlen=strlen(src);
dest=(char*)malloc(len);
char* d=dest;
char* s=src[len];
while(len--!=0){
*d=*s--;
d++;}
printf("%s",dest);
return 0;
}
10、队列和栈有什么区别?11、对于一个频繁使用的短小函数,在C语言中应用什么实现,在C++中应用什么实现?12、软件测试都有那些种类?13、确定模块的功能和模块的接口是在软件设计的哪个阶段完成的?
14、计算表达式值?
unsigned char *p1;
unsigned int *p2;
p1=(unsigned char *)0x801000;
p2=(unsigned int *)0x810000;
请问:
p1+5= ;
p2+5= ;
15、进程和线程的差别?
线程是指进程内的一个执行单元,也是进程内的可调度实体。线程与进程的区别:
(1)调度:线程作为调度和分配的基本单位,进程作为拥有资源的基本单位;
(2)并发性:不仅进程之间可以并发执行,同一个进程的多个线程之间也可并发执行;
(3)拥有资源:进程是拥有资源的一个独立单位,线程不拥有系统资源,但可以访问隶属于进程的资源;
(4)系统开销:在创建或撤消进程时,由于系统都要为之分配和回收资源,导致系统的开销明显大于创建或撤消线程时的开销。
16、Heap与stack的差别。
Heap是堆,stack是栈。
Stack的空间由操作系统自动分配/释放,Heap上的空间手动分配/释放。
Stack空间有限,Heap是很大的自由存储区
C中的malloc函数分配的内存空间即在堆上,C++中对应的是new操作符。
程序在编译期对变量和函数分配内存都在栈上进行,且程序运行过程中函数调用时参数的传递也在栈上进行。
17、解释下列输出结果
char str1[] = "abc";
char str2[] = "abc";
const char str3[] = "abc";
const char str4[] = "abc";
const char *str5 = "abc";
const char *str6 = "abc";
char *str7 = "abc";
char *str8 = "abc";
cout << ( str1 == str2 ) << endl;
cout << ( str3 == str4 ) << endl;
cout << ( str5 == str6 ) << endl;
cout << ( str7 == str8 ) << endl;
18、以下代码中的两个sizeof用法有问题吗?
void UpperCase( char str[] ) // 将小写字母转换成大写字母
{
for( size_t i=0; i<sizeof(str)/sizeof(str[0]); ++i )
if( 'a'<=str && str<='z' )
str -= ('a'-'A' );
}
char str[] = "aBcDe";
cout << "str字符长度为: " << sizeof(str)/sizeof(str[0]) << endl;
UpperCase( str );
cout << str << endl;
18、以下代码中的两个sizeof用法有问题吗?
函数内的sizeof有问题。根据语法,sizeof如用于数组,只能测出静态数组的大小,无法检测动态分配的或外部数组大小。函数外的str是一个静态定义的数组,因此其大小为6,函数内的str实际只是一个指向字符串的指针,没有任何额外的与数组相关的信息,因此sizeof作用于上只将其当指针看,一个指针为4个字节,因此返回4。
注意:数组名作为函数参数时,退化为指针.
数组名作为sizeof()参数时,数组名不退化,因为sizeof不是函数.
19、指出下面代码的输出,并解释为什么?
main()
{
int a[5]={1,2,3,4,5};
int *ptr=(int *)(&a+1);
printf("%d,%d",*(a+1),*(ptr-1));
}
&a是数组指针,其类型为int (*)[5]。&a+1不是首地址+1,系统会认为加一个a数组的偏移,是偏移了一个数组的大小,即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]。
20、请问以下代码有什么问题?
int main()
{
char a;
char *str=&a;
strcpy(str,"hello");
printf(str);
return 0;
}
没有为str分配内存空间,将会发生异常
问题出在将一个字符串复制进一个字符变量指针所指地址。虽然可以正确输出结果,但因为越界进行内在读写而导致程序崩溃。