zoukankan      html  css  js  c++  java
  • 16-高级指针

    目录:

    一、高级指针

    二、malloc函数

    三、calloc函数

    四、realloc函数

    回到顶部

    一、高级指针

    1 堆内存的动态内存分配。内存分为:栈区(变量)、代码区(字符串)、全局区(全局变量)、堆区(自己创建,自己回收,变量,字符串)

    2 为了从堆中动态分配内存,要指定字节个数的空间,返回首地址,如果失败,返回NULL(空)包含头文件stdlib.h,基本的内存操作都写好了。

    3 malloc函数,从堆中分配指定的字节个数的空间,返回首地址,失败返回NULL

    4 calloc函数,从堆中分配指定的字节个数的空间,把所分配的空间所有字节都清零,返回首地址,失败返回NULL

    5 realloc函数,可以调整已经分配的空间,有两种情况,如果当前位置可以调整,在原位置调整,如果当前位置不可以调整,换一个新的位置。

    6 free函数,用于释放从堆中分配的空间。

    回到顶部

    二、malloc函数

    1 引入头文件stdlib.h

    2 堆中没有变量名,只能通过指针的方式拿到内存中的数据(值)

    3 在使用堆内存指针的时候,最好使用const关键字修饰一下。int* const p;

    4 malloc函数可以分配堆内存,以字节为单位的大小。

    5 if (p != NULL) 这里避免内存分配失败,造成程序崩溃,非空验证。

    6 堆内存使用完毕后,一定要释放。free(p);

    回到顶部

    三、calloc函数

    前面跟malloc一样。。。

    7 calloc函数分配内存时,会做清零操作。

    int* p = calloc(3, sizeof(int));

    参数1是元素个数 参数2是每个元素空间

    回到顶部

    四、realloc函数

    1 调整内存空间。

    2 标准格式:realloc(p, 5*sizeof(int));

    可能出现的情况:

    realloc(NULL, 5*sizeof(int));//参数1 调整哪个空间 参数2 调整后的大小

    int* p = realloc(p, NULL);

    3 如果直接把新分配的地址,直接覆盖原来的地址,是有风险的,如果分配失败,将无法将原来的地址找到,可以分配一个新地址。如果原来位置可以调整空间,如果不可以调整,程序会自动在新的位置创建空间,并且将原来的值移动到新的空间。

    4 如果非空 就将新的位置保存到新的指针中。

    练习:(堆区)创建3个位置,保存3个数,修改十个位置,保存十个数。

     1 #include <stdio.h>
     2 #include <stdlib.h>
     3 int main(int argc, const char * argv[])
     4 {
     5     //int number[3] = {0};
     6     //int* p = malloc(sizeof(int)*3);
     7     int* p = calloc(3, sizeof(int));//参数1是元素个数 参数2是每个元素空间
     8     //realloc重新分配空间
     9     int* p2 = realloc(p, 5*sizeof(int));//参数1 调整哪个空间 参数2 调整后的大小
    10     printf("p address:%p
    ",p);
    11     printf("p2 address:%p
    ",p2);
    12     //int* p = realloc(p, NULL);
    13     //printf("number address:%p
    ",number);
    14     printf("p address:%p
    ",p);
    15     if (p != NULL) {
    16         p = p2;
    17         for (int i = 0; i < 5; i++) {
    18             printf("输入一个数:
    ");
    19             scanf("%d",p + i);
    20         }
    21         for (int i = 0; i < 5; i++) {
    22             printf("%d
    ",*(p + i));
    23         }
    24     }else{
    25         printf("分配内存不成功!");
    26     }
    27     free(p);//释放内存,否则会内存泄露
    28     return 0;
    29 }
  • 相关阅读:
    mysqldump 导出数据库为DBname的表名为Tname的表结构 导出数据库的所有表的表结构
    mysqldump 备份某张表 Warning: A partial dump from a server that has GTIDs will by default include the GTIDs of all transactions,
    nfs missing codepage or helper program, or other error
    date 增加一个小时 减少一个小时
    mysqldump 备份单个数据库
    mysql删除账户
    怎么删除某个用户的所有帖子?
    mongodb删除重复数据
    ReSharper2018破解详细方法
    激活windows和office
  • 原文地址:https://www.cnblogs.com/yangmx/p/3474611.html
Copyright © 2011-2022 走看看