嵌入式学习第十三天报告:从void指针深入理解C语言内存与指针
1. void指针:通用内存操作工具
1.1 void指针的基本概念
void指针(void *)是C语言中一种特殊的指针类型,它不指向任何具体的数据类型。void指针的主要特点是:
- 通用性:可以指向任意类型的数据
- 灵活性:通过强制类型转换可以访问不同类型的数据
- 内存操作:主要用于内存地址的存储和传递
1.2 void指针的定义与使用
// void指针的定义void*p=NULL;// 指向不同类型的数据intnum=100;floatfnum=3.14;charch='A';void*vp;vp=#// 指向整型vp=&fnum;// 指向浮点型vp=&ch;// 指向字符型1.3 void指针的强制类型转换
由于void指针没有具体类型,使用时必须进行强制类型转换:
intnum=100;void*vp=#// 错误:不能直接解引用void指针// *vp = 200;// 正确:先进行类型转换int*ip=(int*)vp;*ip=200;printf("num = %d\n",num);// 输出:2001.4 void指针的应用场景
1.4.1 通用函数参数
// 通用的内存设置函数voidset_memory(void*ptr,intvalue,size_tsize){unsignedchar*p=(unsignedchar*)ptr;for(size_ti=0;i<size;i++){p[i]=(unsignedchar)value;}}##2.二级指针:指针的指针 ###2.1二级指针的概念 二级指针是指向指针的指针,用于存储指针变量的地址。 ```cintnum=100;int*p=#// 一级指针,指向intint**pp=&p;// 二级指针,指向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(inti=0;i<size;i++){(*ptr)[i]=i+1;}}}intmain(void){int*array=NULL;allocate_memory(&array,5);// 传递指针的地址if(array!=NULL){for(inti=0;i<5;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!=NULL&&index>=0){// 释放旧字符串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 指针数组
指针数组是数组,数组的每个元素都是指针。
// 定义指针数组inta=10,b=20,c=30;int*ptr_array[3]={&a,&b,&c};// 访问指针数组元素for(inti=0;i<3;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(inti=0;i<4;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(inti=0;i<5;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(inti=0;i<3;i++){for(intj=0;j<4;j++){printf("%2d ",p_matrix[i][j]);// 等价于matrix[i][j]}printf("\n");}4. const指针:保护数据不被修改
4.1 const指针的四种形式
intnum=100;intvalue=200;// 1. 指向常量的指针(指针可变,指向的值不可变)constint*p1=#// *p1 = 300; // 错误:不能修改指向的值p1=&value;// 正确:可以改变指针的指向// 2. 常量指针(指针不可变,指向的值可变)int*constp2=#*p2=300;// 正确:可以修改指向的值// p2 = &value; // 错误:不能改变指针的指向// 3. 指向常量的常量指针(指针和指向的值都不可变)constint*constp3=#// *p3 = 300; // 错误:不能修改指向的值// p3 = &value; // 错误:不能改变指针的指向// 4. 等价于第1种intconst*p4=#// 等价于 const int *p4