C/C++ 笔记 -- 基本概念(2)
2012-02-27 21:26
295 查看
多维数组
一个多维数组在语义上并不等价于一个指向其元素类型的指针,相反他等价于一个“指向数组的指针"
int b[3][4] <=> int(*const b)[4]
int c[3][4][5] <=> int(*const c)[4][5]
char *p1 = new char[5][3]; // ERROR!语义不等价
int *p2 = new int[4][5]; // ERROR!语义不等价
char (*p3)[2] = new char[5][2]; // OK!退化第一维,语义等价
int (*p4)[5][7] = new char[20][5][7]; // OK!退化第一维,语义等价
同理不能用:
delete [][]p3;
delete [][][]p4
来释放,正确应该是:
delete []p3;
delete []p4;
字符串,字符数组,字符指针
字符数组:就是元素为字符(char)类型变量的数组。
字符串:以字符‘\0’结尾的字符数组。或者说存放字符常量的字符数组。
字符指针:执行字符类型变量的指针。
字符串函数(strlen,strcpy,strcmp等等)的参数类型为字符指针,但函数实现默认实参为字符串变量
当字符指针str作用在标准输出函数printf("%s",str), cout << str <<endl;也认为实参为字符串变量。
位域
C中位域必须是int, unsigned int, signed int ,C++还允许是char ,long
位域中定义非具名位域成员,相当于占位符。长度为0的位域用于迫使下一个成员从下一个完整的机器字(word)
开始。位域成员不能取地址(&),位域对象(变量)是可以的。
结构体/类的成员对齐
理解这句话:编译器在考虑一个类型的大小的时候不仅要考虑一个对象的对齐要求,还要考虑该类型
数组的对齐要求。尽量按照从大到小的顺序从前向后依次声明数据成员,并吸纳尾填充来提高内存使用效率。
程序设计时,库(动态库,静态库)和可执行程序之间,成员的对齐方式要一致。
头文件包含的合理顺序
在头文件中:
1)包含当前工程自定义的头文件;
2)包含第三方程序头文件;
3) 包含标准头文件;
在源文件中:
1)包含该源文件对应的头文件;
2)包含当前工程自定义的头文件;
3)包含第三方程序头文件;
4) 包含标准头文件;
#和##运算符
#叫做构串操作符,修饰带参数的红的形参,它将实参的字符转成字符串常量。
#define STRING(x) #x #x
char *s = STRING(abc); // *s="abcabc"
#define TEXT(x) "class" #x
char *s = TEXT(abc); // *s="classabc"
##合并操作符,将出现在其左右的字符序列合成一个新的标识符
#define CLASS_NAME(name) cl_##name
CLASS_NAME(event) 等效cl_evnet
一个多维数组在语义上并不等价于一个指向其元素类型的指针,相反他等价于一个“指向数组的指针"
int b[3][4] <=> int(*const b)[4]
int c[3][4][5] <=> int(*const c)[4][5]
char *p1 = new char[5][3]; // ERROR!语义不等价
int *p2 = new int[4][5]; // ERROR!语义不等价
char (*p3)[2] = new char[5][2]; // OK!退化第一维,语义等价
int (*p4)[5][7] = new char[20][5][7]; // OK!退化第一维,语义等价
同理不能用:
delete [][]p3;
delete [][][]p4
来释放,正确应该是:
delete []p3;
delete []p4;
字符串,字符数组,字符指针
字符数组:就是元素为字符(char)类型变量的数组。
字符串:以字符‘\0’结尾的字符数组。或者说存放字符常量的字符数组。
字符指针:执行字符类型变量的指针。
字符串函数(strlen,strcpy,strcmp等等)的参数类型为字符指针,但函数实现默认实参为字符串变量
当字符指针str作用在标准输出函数printf("%s",str), cout << str <<endl;也认为实参为字符串变量。
位域
C中位域必须是int, unsigned int, signed int ,C++还允许是char ,long
位域中定义非具名位域成员,相当于占位符。长度为0的位域用于迫使下一个成员从下一个完整的机器字(word)
开始。位域成员不能取地址(&),位域对象(变量)是可以的。
结构体/类的成员对齐
理解这句话:编译器在考虑一个类型的大小的时候不仅要考虑一个对象的对齐要求,还要考虑该类型
数组的对齐要求。尽量按照从大到小的顺序从前向后依次声明数据成员,并吸纳尾填充来提高内存使用效率。
程序设计时,库(动态库,静态库)和可执行程序之间,成员的对齐方式要一致。
头文件包含的合理顺序
在头文件中:
1)包含当前工程自定义的头文件;
2)包含第三方程序头文件;
3) 包含标准头文件;
在源文件中:
1)包含该源文件对应的头文件;
2)包含当前工程自定义的头文件;
3)包含第三方程序头文件;
4) 包含标准头文件;
#和##运算符
#叫做构串操作符,修饰带参数的红的形参,它将实参的字符转成字符串常量。
#define STRING(x) #x #x
char *s = STRING(abc); // *s="abcabc"
#define TEXT(x) "class" #x
char *s = TEXT(abc); // *s="classabc"
##合并操作符,将出现在其左右的字符序列合成一个新的标识符
#define CLASS_NAME(name) cl_##name
CLASS_NAME(event) 等效cl_evnet
相关文章推荐
- C++基础学习笔记----第七课(面向对象的基本概念)
- 深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质)
- C++入门学习笔记(一)--面向对象基本概念
- 深入浅出MFC学习笔记:(第一章:win32基本概念,第二章:C++的重要性质)
- C++学习笔记之类的基本概念1
- C/C++ 笔记 -- 基本概念(1)
- C++基础学习笔记----第七课(面向对象的基本概念)
- <C++学习笔记 -- 1> C++中的一些基本概念
- C++一些基本概念总结【面向过程篇】——指针
- 《JavaScript高级程序设计》笔记——chapter3 基本概念
- Java学习笔记-《Java程序员面试宝典》-第四章基础知识-4.1基本概念(4.1.11-4.1.12)
- 学习笔记 学习jvm 原理 最基本概念(编译与运行概念)
- Ruby on Rails入门笔记(1)ruby基本语法概念
- C++静态成员函数基本概念讲解
- 数据结构基本概念 - 学习笔记
- MySQL学习笔记20150923基本概念与数据库和表的创建
- 卷积神经网络CNN基本概念笔记[转载]
- Hadoop学习笔记(1)-基本概念
- 【C++研发面试笔记】11. 基本数据结构-红黑树RBT
- 计算机操作系统笔记(2)--进程管理之进程的基本概念