文章目录
动态内存分配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;
}
3.2:动态分配一维数组
int main() {
int len
;
printf("输入你要存放的元素个数:");
scanf("%d", &len
);
int *pArr
= (int*)malloc(len
*4);
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
= &i
;
}
int main() {
int* p
;
f(&p
);
printf("%d\n", *p
);
return 0;
}
正确示例:
#include<stdio.h>
#include <malloc.h>
void f(int** q
) {
*q
= (int*)malloc(sizeof(int));
**q
= 5;
}
int main() {
int* p
;
f(&p
);
printf("%d\n", *p
);
return 0;
}
指针的重要性
表示一些复杂的数据结构快速的传递数据,减少了内存的耗用[重点]使函数返回一个以上的值[ ]能直接访问硬件能够方便的处理字符串是理解面向对象语言中引用的基础
总结:指针是C语言的灵魂