开始:
c++内置类型分为两组:基本类型和复合类型。复合类型有:数组、字符串、指针、引用、结构体和共用体。
总结:char * 字节数不一样。还有long的字节数不一样,其他都一样。
32位编译器:跟编译器有关。
char :1个字节
char*(即指针变量):
4个字节(32位的寻址空间是2^32, 即32个bit,也就是4个字节。同理64位编译器)
short int : 2个字节
int:
unsigned int : 4个字节
float:
double:
long:
long long:
unsigned long:
64位编译器:
char :1个字节
char*(即指针变量): 8个字节
short int : 2个字节
int:
unsigned int : 4个字节
float:
double:
long:
long long:
unsigned long:
内存分配:
堆
栈
全局(静态存储区)存放全局变量和静态变量。包括DATA段(全局初始化区)和BBS段(全局未初始化区)程序结束后由系统释放。
文字常量区,存放常量字符串
程序代码区,存放函数体的二进制代码
1.数组定义中类型不能是引用,即没有引用数组,这是因为引用是不能赋值的,而数组中的元素时可以被赋值。
虽然没有引用数组,但是数组可以引用。 int (&P)【6】=a 引用必须初始化。
2.函数体外定义的内置类型数组,初始化为0,函数体内定义的内置类型数组,元素无初始化,若初始化部分元素,则后面的初始化为0.
3.要动态声明一维数组。
int *a = new int【n】
释放 delete 【】a
4.为了兼容C语言,C++所有的字符串常量都由编译器自动在末尾添加一个空字符null
c风格字符串末尾必须有一个字符\0
包括字符串常量和末尾添加了\0的字符数组
5 C/c++中有很多字符串处理函数,传递给这些标准库函数例程的指针必须具有非零值,并且指向仪null结束的字符数组。
6.在声明多维数组时,第一维数字可以省略。
7.数组在初始化时,用花括号进行多维的赋值,不能用(),否则进入里面单独运算,整个表达式的值,是最后一个表达式的值。
8.int **a=new int * [m]
声明一个二维数组,也就是声明一个指针数组。 int *[m]类型是一个指针数组类型。
9.const * p 指针指向一个常量,指针指向的数值不能通过指针修改。
和* const p 常量指针。指针保存的值不能修改
10.指针数组,是一个数组里面装着指针。 int *a[10]
数组指针 是一个指向数组的指针。 int (*P)[10]
11.char *p= "hello" p指向的是位于文字常量区的字符串,是不允许修改的,修改也不知道改什么地方。
12.数组的首地址是常量,不可以变更。不能对首地址a进行一些加减操作。
13.再次理解二位数组
int a[4][5]
a是包含四个元素的数组,每个元素都是由5个整数组成的数组。
&a 表示数组的首地址。类型为 int(*) 【4】【5】
a 类型为 int * 【5】 a为指向数组a第0个元素 a[0]的指针。
*a或a[0] 类型为int * 指向 数组a[0]的首元素a00 的指针。
14 .在考察多级指针的时候,一定要明确指针指向的是什么,才能知道它加1后跳过多少字节。
int a[2][3][4]
则&a的类型是 int (*&a)【2】【3】【4】
显然 &a的类型是 int (*)[2][3][4] 加1则相当于跳过整个数组。
15.线性表是一种逻辑结构。
顺序表和链表是一种存储结构。
线性表中元素的位序是从1开始的,而数组中元素的下标是从0开始的。
16.对称矩阵的压缩,要包括对角线,及对角线以上的元素。
17.只有宏替换来定义数组的长度。
18.int在64位系统中占4个字节。
19.数组中一个数字的出现超过了数组长度的一半,请找出这个数。
解答:
这个数字出现的个数大于其他全部出现个数之和。
如果每次删除两个不同的数的话,最后剩余的一定是那个数字。
a.初始化,设当前的数组为data[],数组的长度为n,current=data[0];curretnum=1
b.设置i,遍历整个数组。
c.当下一个data[i]与current相同时,就将currentnum++,就是把这个数字的个数加1.
d如果不同,则currentnum--,如果数字删除干净,则current=当前的data[i]
e当i=数据长度时,就输出current,如果不等于就继续i++;
(这里最坏的情况,是每个数都与那个数进行一次比较,但是仍旧是那个数剩下,其他情况,当然也是他剩下。
如果这个数减少到0的话,就换成下一个数。之前的数因为比较过了,就相当于删除掉了)