《黑马视频13期》提高班01

  1. 数据类型的本质(如Int、double等):告诉编译器预算对象分配的内存大小,固定内存大小的别名。int(4个字节),double(8个字节)。
  2. 为什么在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,都是指针变量,但是其指向的类型不一样。

猜你喜欢

转载自blog.csdn.net/songsong2017/article/details/83380640
今日推荐