(判断题)指针就是地址,因此一个变量的指针就是该变量的地址。
答案:错误;解释:指针是个变量,指针的值是个地址,地址是个常量。char* s=”AAA”;
s[0]=’B’; //错误,初始化指针时所创建的字符串常量被定义为只读,修改违法char ch;int i;float f;double d;
表达式:ch/i+(f*d-i)
的结果类型为double1
2
3
4
5
6
7
8int main()
{
int a = 5, b = 0;
int c = MAX(++a, b);
int d = MAX(++a, b + 10);
printf("%d %d %d %d\n", a, b, c, d);
return 0;
}Output: 8 0 7 10
解释:注意define,第一次调用MAX时,++a先执行了一次,此时a为6,由于满足宏定义中(a)>(b)的条件,所以执行a,这个a就对应++a,所以a又自增了一次,变为7,由此得出c为7。 第二个MAX时a又自增了一次,此时为8,由于不满足条件,所以执行的是宏定义中的b,没有执行++a,所以a最终为8关于fseek() 参考:C库函数 - fseek()
转义字符分三种,一般转义字符,八进制转义字符和十六进制转义字符
一般转义字符,如‘\b’,由两个字符表示,其实代表一个字符,这个代表退格字符
八进制转义字符,如‘\007’,三位数字是八进制的,ASCII码为7的表示响铃
十六进制转义字符,如’\xfe’,同样后面数字是所表示意思的Ascii码的十六进制表示,注意一定要有x,大小写都行
在C程序中逗号运算符的优先级最低,赋值运算符其次;j++是属于赋值语句;sizeof()属于一元运算符;
C中&&(逻辑与)和&(按位与)
- 按位与运用二进制进行计算,逻辑与比较符号两边的真假输出逻辑值。
- 按位与对所有的表达式都要判断,逻辑与运算符第一个表达式不成立的话,后面的表达式不运算,直接返回。
- 按位与&输出运算结果为不同的数值,逻辑与 && 输出逻辑值true或者 false。
两个指针变量不可以相加,因为指针变量相加没有意义。
scanf函数不能指定输入精度,可以指定长度,比如%m.nf是不允许的,但是可以%mf(m为整数)。
scanf("%7.2f",&a);
不合法多态类中的虚函数表建立在编译阶段。对类的编译,内存分布不太了解。
const int* p
是常量指针,p可以改变,*p不能改变;int* const p = &a
是指针常量,p不可以改变,*p能改变;记忆方法:const后面是p,p不能改变,const后面是*p,*p不能改变;还有一种const int* const p = &a
,p和*p都不能改变。C++程序执行时,内存划分4个区域。不同区域存放的数据,赋予不同的生命周期,给我们更大的灵活编程。代码区和全局区是在程序运行前划分,堆栈是在程序运行后划分。
- 代码区:存放函数体和二进制代码,由操作系统负责管理(共享、只读)
- 全局区:存放全局变量和静态变量以及字符串,全局常量(程序结束后,由系统自动回收)
- 栈区:由编译器自动分配释放,存放函数的参数值,局部变量,局部常量等
- 堆区:由程序员分配释放,若程序员不释放,程序结束时,由系统自动回收
C++用new关键字请求内存,用delete释放内存,参考:C++ 动态内存
浅拷贝只复制指向某个对象的指针,而不复制对象本身,新旧对象还是共享同一块内存。但深拷贝会另外创造一个一模一样的对象,新对象跟原对象不共享内存,修改新对象不会改到原对象。如果属性有在堆区开辟的,一定要自己提供拷贝构造函数,防止浅拷贝析构时重复释放堆带来的问题。
类成员中有其他类对象,构造时先构造成员中的类对象,再构造自身;析构时相反。
静态成员变量:所有对象共享同一份数据;在编译阶段分配内存;类内声明,类外初始化;静态成员函数:所有对象共享同一个函数;静态成员函数只能访问静态成员变量;
1
2
3
4
5ostream& operator<<(ostream& cout, Class &c)
{ // c++重载<<运算符
cout << c.m_A; // 打印成员变量
return cout; // 链式编程
}