1.定义数组时,元素从低地址向高地址存储,如整型数组,相邻元素地址相差4个字节。
可以看到相邻元素内存地址相差4个字节。
计算机存储器的内存以字节为基本单位,即一个地址代表一个字节(Byte)的存储空间。 TB,GB,MB,KB,B(Byte),bit,1Byte=8bit(位)。
2. const char * p, char const * p, char * const p:
const char* p:字符指针p指向的内容为常量,不可更改,不可通过指针p修改,但若指向内容有其它名称,可通过其它名称修改,故不是完全意义上的常量,只是针对p是常量;
char const * p:同上
char * const p:指针p为常量,不可修改,即p的内容(指向内存的地址)不可修改,但p指向的内容可修改。
3.字符数组末尾默认不会有结束符'\0',字符串末尾默认会有
4.查询变量类型
#include<typeinfo>
typeid(i).name();
5.char * ptr="hello"; 声明一个char类型指针,指向字符串“hello”,ptr存的是“hello”首字符地址,若直接cout<<ptr;则会输出“hello”,字符串支持这种输出,因为字符串存储在一块连续的内存空间中,且末尾有结束符,输出首地址则会自动输出整个字符串。
6.string类常用操作(初始化,遍历,连接)
str2-7之前已声明为string类型:
5.任何类型的指针在32位系统中占用字节数为4,64位系统中占用字节数为8,sizeof()可查看某对象的占用字节数。
6.c++内存管理:
c++中,内存分为:栈,堆,自由存储区,静态存储区,常量存储区。
栈:执行函数时,函数内的局部变量的存储单元在栈上创建,函数结束时自动被释放。
堆:由malloc分配的内存块,用free释放内存。
自由存储区:由new分配的内存块,用delete释放。
静态存储区:存放全局变量和静态变量。
常量存储区:存放常量,不允许修改。
7.为什么cout字符型指针输出的不是地址而是字符或字符串,因为c++标准库I/O类对<<操作符重载,在遇到字符型指针时会当作字符串名来处理,输出指针所指字符串。要想输出地址值,得让<<操作符不判断它是字符型指针,所以加个强制类型转换,用static_cast实现,将字符串指针转换为无类型指针即可。
8.字符串常量存在静态存储区,在内存中仅有一份拷贝。
发现a和b指向同一内存地址,即“hello”在内存中只有一份拷贝。
a,b是数组变量,在栈中分配了各自的内存空间,存储的值是“hello”,而“hello”依然存储在静态存储区内,输出的是栈中分配的a,b的地址,而不是“hello”的地址。
在函数中,若函数的返回值是一个局部变量的地址,该局部变量一定要声明为static类型,倘若不声明,函数调用结束时,局部变量地址回收,返回则是乱码。
9.类成员函数用const定义,表示该函数不能修改类对象数据成员,也不能调用非const成员函数;
10.类型转换:
static_cast<目标类型>标识符:静态类型转换;
dynamic_cast:父子类间的类型转换
const_cast:去const属性转换,目标类型只能是指针或引用;
reinterpret_cast:重新解释类型转换。
11.类的静态成员和非静态成员
静态成员在对象创建之前就已分配了内存空间,而非静态成员在对象创建时分配空间,对象撤销时释放空间,因此可以用类名直接调用静态成员,而不能调用非静态成员。
1.类中静态成员函数用static声明,可以用类直接调用静态成员函数,而非静态成员函数只能用类对象调用。
2.类对象可以调用静态成员函数和非静态成员函数。
3.静态成员函数不能引用非静态成员。
4.非静态成员函数可以使用静态成员,反之不能。
5.类的静态成员变量使用前必须先初始化。