C\C++语言题库

来源:互联网 发布:三毛作品 知乎 编辑:程序博客网 时间:2024/05/15 01:35

1.指针

1.求输出结果

int a[2][2][3]= { {{1,2,3},{4,5,6}},{{7,8,9},{10,11,12}}};int *ptr=(int *)(&a+1);printf(“%d %d”, *(int*)(a+1), *(ptr-1));

答案:7 12
1. &a+i = a + i*sizeof(a);
2. a+i = a +i*sizeof(a[0]);
(int)(a+1) 指向数组 a[2] 的第二个元素中的第一个,也就是内部第二层大括号的第一个元素
(ptr-1)整个数组的最后一个元素,因为 (int )(&a+1); 指向整个数组的下一个位置

2.char *p=”Turbo C”的含义
P是一个指向字符串的指针变量,只能存放地址。上述语句的作用是将一个字符串常量的首地址赋给字符指针变量P。注意,是地址,地址,地址。

3.任何类型指针都可以赋值给void指针,void指针赋值给其他类型指针都要进行转换

4.*p++ 自增p 还是 p 所指向的变量?
后缀++ 和– 操作符本质上比前缀一目操作的优先级高, 因此p++ 和(p++) 等价, 它自增p 并返回p 自增之前所指向的值。
要自增p 指向的值, 使用(*p)++, 如果副作用的顺序无关紧要也可以使用++*p。

5.这段程序的输出是()

void foo(int b[][3]){        ++b;        b[1][1]=9;}void main(){       int a[3][3]={{1,2,3},{4,5,6},{7,8,9}};       foo(a);       printf(“%d”,a[2][1]);}

数组传递了首地址,b[0][0]指向数组a[0][0],但是执行++b后,b[0][0]指向a[1][0],因此b[1][1]就是a[2][1],b[1][1]=9即a[2][1]=9。

2.运算

1.以下错误的是
A.a+=(a++)
B.a+=(++a)
C.(a++)+=a
D.(++a)+=(a++)
答案:C
以整形数据为例:
++i:

int pre_increment(int &a){ a=a+1; return a; }

函数返回的引用类型可以作为左值。
i++:

int post_increment(int &a){ int temp=a; a=a+1; return temp; } 

函数返回的一般类型不能作为左值。
3.析构函数定义数量
只能定义一个析构函数,多了的话编译器不知道调用哪个.
1、虚析构函数和析构函数在功能上是一回事,因此除了动态联编(此处意思:需要销毁 父类指针指向的子类对象的空间)外,其他性质和析构函数类似。
2、析构函数与构造函数名字相同,但它前面必须加一个波浪号(~);
3、析构函数没有参数,也没有返回值,而且不能重载,因此在一个类中只能有一个析构函数;当撤消对象时,编译系统会自动地调用析构函数。

4.在函数代码小,频繁调用情况下适宜采用内联函数。
如果内联函数体非常短,编译器为这个函数体生成的代码就会真的比为函数调用生成的代码要小许多。将会确实带来更小的目标代码和更高的缓存命中率

3.其他知识点

1.负数的储存形式
C语言中变量以补码形式存放在内存中,正数的补码与原码相同,负数求补码方式为(符号位不变,其余各位取反,最后末尾加1);
shotr Y = -9,负数,原码:1000 1001,补码:1111 0111,扩展到16位高位补1,结果为FFF7H;

2.左值和右值
C/C++语言中可以放在赋值符号左边的变量,即具有对应的可以由用户访问的存储单元,并且能够由用户去改变其值的量。左值表示存储在计算机内存的对象,而不是常量或计算的结果。或者说左值是代表一个内存地址值,并且通过这个内存地址,就可以对内存进行读并且写(主要是能写)操作;这也就是为什么左值可以被赋值的原因了。相对应的还有右值:当一个符号或者常量放在操作符右边的时候,计算机就读取他们的“右值”,也就是其代表的真实值。右值指的是引用了一个存储在某个内存地址里的数据。
简单来说就是,左值相当于地址值,右值相当于数据值。

特殊关键词与转义字符

1.转义字符串,第一部分是一个&符号,英文叫ampersand;第二部分是实体(Entity)名字或者是#加上实体(Entity)编号;第三部分是一个分号。
比如,要显示小于号(<),就可以写 < 或者 < ,用实体(Entity)名字的好处是比较好理解,一看lt,大概就猜出是less than的意思。

原创粉丝点击