2026/1/10 12:00:27
网站建设
项目流程
广州网站建设中心,东营网络建设,做ppt好用的网站有哪些,关于新品牌的营销策划文章目录深究指针_2void *类型内存管理内存布局malloccalloc()调整函数realloc()数组与指针指针和字符串操作深究指针_2
void *类型
**#xff08;void *#xff09;**是任意类型指针#xff0c;更准确地说#xff0c;是“通用指针”或者是“无类型指针”。与函数定义voi…文章目录深究指针_2void *类型内存管理内存布局malloccalloc()调整函数realloc()数组与指针指针和字符串操作深究指针_2void *类型**void ***是任意类型指针更准确地说是“通用指针”或者是“无类型指针”。与函数定义void相似多用在动态内存分配等地方,重点在于其通用性void *就是一个指向未知类型数据的内存地址的指针。它只包含一个地址值但不包含关于这个地址上存储的数据类型的信息。特性可以指向任何类型的数据inta10;floatb3.14;charcX;intarr[5]{1,2,3,4,5};void*vp;// 声明一个void指针vpa;// 可以指向intvpb;// 可以指向floatvpc;// 可以指向charvparr;// 可以指向数组不能直接解引用不能进行指针算术运算使用前要进行类型转换inta10;void*p;int*a_ptr(int*)p;内存管理内存布局在此之前我们先了解C程序内存布局。栈(stack)局部变量函数参数自动管理······堆Heap动态内存分配手动管理BSS段没有初始化的全局/静态变量数据段data已经初始化的全局/静态变量代码段text程序代码malloc#includestdio.h#includesrdlib.hintmain(){intn,sum,i,*p;printf(Enter n:);scanf(%d,n);if((p(int*)malloc(n*sizeof(int)))NULL){printf(Fail to allocate memory.\n);exit(1);// 终止程序执行}//强制转换为整形指针,并且判断是否分配成功//p已经指向基地址printf(Enter %d integers:,n);for(i0;in;i){scanf(%d,pi);//本身就是地址也可以是p[i]//p已经是数组名}for(i0;in;i){sum*(pi);}free(p);//用完后一定要释放return0;}总结确定需要多少内存空间利用内存动态分配函数srdlib.h用指针指向此空间指向基地址即可只可以通过指针访问内存使用完毕释放void*malloc(unsighnedchar)在动态存储去无符号整型大小为字节数申请成功则返回一个指向分配内存空间的起始地址的指针类型为 void *(上述通用指针)不成功返回NULLint*p;if((p(int*)malloc(n*sizeof(int)))NULL){printf(Not able to allocate memory.\n);exit(1);}calloc()自动对整个区域进行初始化而malloc()不执行操作void*calloc(unsignedn;unsignedsize)在动态存储区连续分配n个存储块每个存储块长度为size并且分配后全部初始化为0空间释放函数voidfree(void*ptr);//指向释放空间首地址指针free(p);调整函数realloc()void*realloc(void*ptr,unsignedsize)更改以前的存储分配ptr必须是以前通过动态内存分配得到的指针参数size是现在需要的空间大小如果调整失败返回NULLptr指向存储块的内容不变如果调整成功返回指向大小为size的存储块的起始地址的指针并保证该块的内容与原块一致。如果size小于原块内容为前size范围内的数据如果size大于原块则原有数据存在新快的前一部分如果分配成功原存储快内容就可能改变了因此不能再通过ptr去使用数组与指针数组名作为函数的参数在函数调用时将实参数组首元素的地址传给形参指针变量因此形参也指向实参数组的首元素如果改变形参所指向的单元的值就改变实参数组元素的值。源于数组名是指针常量指针作为函数的参数。指针和字符串操作我们先来分析一个实例#includestdio.hintmain(){char*str[]{Hello,World,C};char**ppstr;printf(%c\n,**pp);// 输出 Hprintf(%s\n,*(pp1));// 输出 Worldprintf(%c\n,*(*pp1));// 输出 eprintf(%c\n,*((*pp1)2);//输出rreturn0;}我们来逐行分析这段代码char*str[]{Hello,World,C};这一行定义了一个指针数组str是一个数组包含了三个char*类型元素分别指向定义的三个元素str[i]指向第i个字符串。内存布局str[0]→ 指向字符串 “Hello”str[1]→ 指向字符串 “World”str[2]→ 指向字符串 “C”*str[0] “Hello”char**ppstr;pp是一个指向指针的二级指针str作为数组名退化为指向数组第一个元素的指针也就是str[0]pp str[0]*pp str[0] ‘Hello’ 这是指向第一个字符的指针**pp *(*pp) *str[0] ‘H’printf(%s\n,*(pp1));pp1 str[1] 移动一个指针大小的距离*(pp1) str[1] “World”printf(%c\n,*(*pp1));*pp str[0](数组名)是指向字符串Hello的指针存储第一个字母的地址*pp1指向第二个字母的指针即’e‘存储的位置。*(*pp1) ‘e’事实上以上仅仅作为理解写代码过于弯绕繁琐通常指针数组可以直接: str[i]等效于(pp i),str[i][j] 等效于 **pp i j*