voidtest01(){//开辟连续的十个int类型的内存空间int* p =(int*)calloc(10,sizeof(int));for(int i =0; i <10;++i){
p[i]= i +1;}for(int i =0; i <10;++i){printf("%d ", p[i]);}if(p){free(p);
p =NULL;}}
voidtest02(){int* p =malloc(sizeof(int)*10);for(int i =0; i <10;++i){
p[i]= i +1;}for(int i =0; i <10;++i){printf("%d ", p[i]);}printf("\n");printf("%d\n", p);
p =realloc(p,sizeof(int)*10);printf("%d\n", p);for(int i =0; i <20;++i){printf("%d ", p[i]);}}
3.一级指针注意事项
1 越界
2.指针叠加会不断改变指针指向
voidtest(){char*p =(char*)malloc(50);char buf[]="abcdef";int n =strlen(buf);int i =0;for(i =0; i < n; i++){*p = buf[i];
p++;//修改原指针指向}//因为指针指向改变,因此释放时会发生错误(free内部会存储之前开辟的空间大小,释放时因为释放原开辟空间的内存大小,同时指针指向改变,因此会发生错误)free(p);}
3 返回局部变量地址
4 同一块内存释放多次
4.二级指针
1.二级指针做输入特性
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//主调函数开辟空间voidprintArray(int** pArray,int len){for(int i =0; i < len; i++){printf("%d\n",*pArray[i]);}}voidtest01(){//创建在堆区int** pArray =malloc(sizeof(int*)*5);int a1 =10;int a2 =20;int a3 =30;int a4 =40;int a5 =50;
pArray[0]=&a1;
pArray[1]=&a2;
pArray[2]=&a3;
pArray[3]=&a4;
pArray[4]=&a5;printArray(pArray,5);if(pArray !=NULL){free(pArray);
pArray =NULL;}}voidtest02(){//创建在栈区int* pArray[5];for(int i =0; i <5; i++){
pArray[i]=malloc(4);*(pArray[i])=10* i;}printArray(pArray,5);}intmain(){//test01();test02();return0;}
2 二级指针做形参输出特性
#define _CRT_SECURE_NO_WARNINGS#include<stdio.h>#include<string.h>#include<stdlib.h>//输出特性,内存又被调函数分配,主调函数释放voidoutValue(int**p){int* temp =(int*)malloc(sizeof(int)*10);for(int i =0; i <10; i++){*(temp+i)= i +1;}*p = temp;}voidtest01(){int* p =NULL;outValue(&p);for(int i =0; i <10; i++){printf("%d ",*(p + i));}if(p !=NULL){free(p);
p =NULL;}}intmain(){test01();return0;}