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 }
原文地址:https://www.cnblogs.com/yangmx/p/3474611.html