
1. void指针通用内存操作工具1.1 void指针的基本概念void指针void *是C语言中一种特殊的指针类型它不指向任何具体的数据类型。void指针的主要特点是通用性可以指向任意类型的数据灵活性通过强制类型转换可以访问不同类型的数据内存操作主要用于内存地址的存储和传递1.2 void指针的定义与使用// void指针的定义void*pNULL;// 指向不同类型的数据intnum100;floatfnum3.14;charchA;void*vp;vpnum;// 指向整型vpfnum;// 指向浮点型vpch;// 指向字符型1.3 void指针的强制类型转换由于void指针没有具体类型使用时必须进行强制类型转换intnum100;void*vpnum;// 错误不能直接解引用void指针// *vp 200;// 正确先进行类型转换int*ip(int*)vp;*ip200;printf(num %d\n,num);// 输出2001.4 void指针的应用场景1.4.1 通用函数参数// 通用的内存设置函数voidset_memory(void*ptr,intvalue,size_tsize){unsignedchar*p(unsignedchar*)ptr;for(size_ti0;isize;i){p[i](unsignedchar)value;}}##2.二级指针指针的指针 ###2.1二级指针的概念 二级指针是指向指针的指针用于存储指针变量的地址。 cintnum100;int*pnum;// 一级指针指向intint**ppp;// 二级指针指向int*printf(num的地址: %p\n,num);printf(p的值: %p\n,p);printf(pp的值: %p\n,pp);printf(*pp的值: %p\n,*pp);// 等价于pprintf(**pp的值: %d\n,**pp);// 等价于num2.2 二级指针的应用2.2.1 修改函数外部的指针voidallocate_memory(int**ptr,intsize){*ptr(int*)malloc(size*sizeof(int));if(*ptr!NULL){for(inti0;isize;i){(*ptr)[i]i1;}}}intmain(void){int*arrayNULL;allocate_memory(array,5);// 传递指针的地址if(array!NULL){for(inti0;i5;i){printf(array[%d] %d\n,i,array[i]);}free(array);}return0;}2.2.2 字符串数组操作voidmodify_string_array(char**str_array,intindex,constchar*new_str){if(str_array!NULLindex0){// 释放旧字符串free(str_array[index]);// 分配新字符串str_array[index](char*)malloc(strlen(new_str)1);if(str_array[index]!NULL){strcpy(str_array[index],new_str);}}}3. 指针数组与数组指针3.1 指针数组指针数组是数组数组的每个元素都是指针。// 定义指针数组inta10,b20,c30;int*ptr_array[3]{a,b,c};// 访问指针数组元素for(inti0;i3;i){printf(ptr_array[%d] %p, *ptr_array[%d] %d\n,i,ptr_array[i],i,*ptr_array[i]);}// 字符串指针数组常用char*str_array[]{Hello,World,Embedded,System};for(inti0;i4;i){printf(str_array[%d] %s\n,i,str_array[i]);}3.2 数组指针数组指针是指针指向一个数组。// 定义数组指针intarr[5]{1,2,3,4,5};int(*p)[5]arr;// p是指向包含5个int的数组的指针// 访问数组元素for(inti0;i5;i){printf((*p)[%d] %d\n,i,(*p)[i]);// 等价于printf(arr[%d] %d\n, i, arr[i]);}// 二维数组与数组指针intmatrix[3][4]{{1,2,3,4},{5,6,7,8},{9,10,11,12}};int(*p_matrix)[4]matrix;// 指向包含4个int的数组的指针for(inti0;i3;i){for(intj0;j4;j){printf(%2d ,p_matrix[i][j]);// 等价于matrix[i][j]}printf(\n);}4. const指针保护数据不被修改4.1 const指针的四种形式intnum100;intvalue200;// 1. 指向常量的指针指针可变指向的值不可变constint*p1num;// *p1 300; // 错误不能修改指向的值p1value;// 正确可以改变指针的指向// 2. 常量指针指针不可变指向的值可变int*constp2num;*p2300;// 正确可以修改指向的值// p2 value; // 错误不能改变指针的指向// 3. 指向常量的常量指针指针和指向的值都不可变constint*constp3num;// *p3 300; // 错误不能修改指向的值// p3 value; // 错误不能改变指针的指向// 4. 等价于第1种intconst*p4num;// 等价于 const int *p4