指针三

tech2022-07-13  157

文章目录

动态内存分配1. 传统数组的缺点:2.为什么需要动态分配内存3.动态内存分配举例、动态 数组的构造4.多级指针5.跨函数使用内存的问题 指针的重要性

动态内存分配

1. 传统数组的缺点:

1.1: 数组长度必须事先制定,且只能是常整数,不能是变量例子: int a[5];//0K int len = 5;int a[len];//error /*注意:这是C99之前的*/1.2: 传统形式定义的数组,该数组的内存程序员无法手动释放在一个函数运行期间,系统为该函数中数组所分配的空间会一直存在,直到该函数运行完毕时,数组的空间才会被系统释放1.3:数组的长度一旦定义,其长度就不能在更改数组的长度不能在函数运行的过程中动态的扩充或缩小1.4:A函数定义的数组,在A函数运行期间可以被其它函数使用,但A函数运行完毕之后,A函数中的数组将无法在被其他函数使用传统的数组不能跨函数使用

2.为什么需要动态分配内存

动态数组很好的解决了传统数组的这4个缺陷 传統数组也叫静态数组

3.动态内存分配举例、动态 数组的构造

3.1: #include<stdio.h> #include<malloc.h> int main(){ int i = 5; int *p = (int *)malloc(4); printf("%d", sizeof(p)) ; free(p); return 0; } /* 1.要使用malloc函数,必须添加malloc.h这个头文件 2.malloc函数只有一个形参,并且形参是整型 3.4表示请求系统为本程序分配4个字节 4。malloc函数只能退回第一个字节的地址 5.int *p = (int *)malloc(4) 这行分配了8(32bit)/12(64bit)个字节,p变量占4(32bit)/8(64bit)个字节,p所指向的内存也占4个字节 6.p本身所占的内存是静态分配的,p所指向的内存是动态分配的 */ 3.2:动态分配一维数组 int main() { int len; printf("输入你要存放的元素个数:"); scanf("%d", &len); int *pArr = (int*)malloc(len*4);//动态构造一个一维数组,长度为len //对一维数组进行赋值 for(int i = 0; i<len; i++){ scanf("%d", &pArr[i]); } //对一维数组进行输出 printf("一维数组的内容是:\n") ; for(int i = 0; i<len ; ++i){ printf("%d\n", pArr[i]); } free(pArr); return 0; }

4.多级指针

5.跨函数使用内存的问题

错误示例:

#include<stdio.h> void f(int** q) { int i = 5; //*q等价于p q和**q都不等价于p *q = &i;//p = &i; } int main() { int* p; f(&p); printf("%d\n", *p);//函数f的生存周期已经结束,不能调用 return 0; }

正确示例:

#include<stdio.h> #include <malloc.h> void f(int** q) { *q = (int*)malloc(sizeof(int)); //q = 5 //error //*q = 5 //p = 5 **q = 5;//*p = 5 } int main() { int* p; f(&p); printf("%d\n", *p); return 0; }

指针的重要性

表示一些复杂的数据结构快速的传递数据,减少了内存的耗用[重点]使函数返回一个以上的值[ ]能直接访问硬件能够方便的处理字符串是理解面向对象语言中引用的基础

总结:指针是C语言的灵魂

最新回复(0)