- 数据类型的本质(如Int、double等):告诉编译器预算对象分配的内存大小,固定内存大小的别名。int(4个字节),double(8个字节)。
- 为什么在32位系统下,指针占4个字节?64位占8个字节?
虚拟内存。32位系统最大能开辟4G(2的32次方)的虚拟内存,地址为0x00000000~0xffffffff,所以指针占4个字节。而64位能开辟128G虚拟内存。
3. int array[10]; array是数组的首地址(本质就是int *),而&array是数组的地址(int[10]*) ,所以array和&array+1偏移量是不同的,前者偏移4个字节,后者偏移40个字节。
4 void *,万能指针。eg:void* memcpy(void *dst, const void *src, size_t len);
5 地址其实就是个数值。int a = 10; int addr = (int)&a; *((int*)addr) = 200; 若a的地址是7339369,则*((int*)7339369)) = 200;
6 程序的内存四区模型:代码区(操作系统管理,存放程序的二进制代码)、全局区(静态区static)(常量(如字符串常量)和全局变量、操作系统管理)、栈区stack(程序局部变量)、堆区heap(操作系统管理)。
char *a = "1234546",在函数里,a在栈区,而“1234546”是字符串常量在全局区。字符串常量是无法修改的。
举个列子,说明字符串常量和局部变量
char* test1(char *dst)
{
dst = "1111";
return dst;
}
char* test2()
{
char a[] = "1111";
return a;
}
void main()
{
char *p = NULL;
p = test1(p);
printf("%s",p); //输出成功
p = test2();
printf("%s",p); //错误输出
}
7 当在堆上开辟空间时,最好先初始化为0。这样可以避免一些字符串拷贝等问题(\0)
int HeapCreate(int size)
{
int *p = NULL;
p = (int*))malloc(size * sizeof(int));
if(p == NULL)
{
fprintf(stderr,"malloc %d,err",size);
return 1;
}
//初始化
memset(p,0,size * sizeof(int));
}
而对于C++中的new,初始化的时候,注意三点:
(1)元素只能初始化为元素类型的默认值,而不能像数组变量一样,用初始化列表为数组元素提供各不相同的初值。
(2)对于内置数据类型元素的数组,必须使用()来显示指定程序执行初始化操作,否则程序不执行初始化操作:
(3)类类型元素的数组,则无论是否使用(),都会自动调用其默认构造函数来初始化:
int *p = new int[5]; //每个元素没有初始化
string *str = new string[5]; //每个元素调用构造函数初始化
//
int *p = new int[5](); //每个元素初始化为0
8 指针也是数据类型,32位占4个字节。指针只不过保存的是地址。二级指针保存的是一级指针的地址。不管二级三级指针,都是占4个字节,都是数据类型。指针在内存的地址和指针指向的地址是两个完全不同的概念。如int *p1,double *p2,都是指针变量,但是其指向的类型不一样。