C语言指针(中)

张开发
2026/5/5 18:15:41 15 分钟阅读
C语言指针(中)
系列文章目录第九章 操作符详解第十章 C语言指针上文章目录系列文章目录前言一、字符指针变量二、数组指针变量三、二维数组传参四、函数指针变量总结前言本文接上篇指针内容继续书写指针的内容。一、字符指针变量在指针类型中有一种指针类型叫做字符指针 char*charchw;char*pcch;char*pstrhello world;这里关于字符串指针和数组的类似并非是把整个字符串放入到指针变量之中而是存放首元素字符的地址。charstr1[]hello world;charstr2[]hello world;char*str3hello world;char*str4hello world;这里若是使用判断str1和str2会发现输出的是false而str3和str4却是true这是因为C/C会把常量字符串单独存储到一个内存区域当几个指针指向同一个字符串的时候他们实际会指向同一块内存。但是若是用同样的字符串去初始化不同是数组会开辟出不同的内存块。因此str1和str2不同而str3和str4相同。二、数组指针变量数组指针变量是存放数组的地址能够指向数组的指针变量他与我们之前的指针数组不同。int*p1[10];//指针数组存放指针的数组int(*p2)[10];//数组指针p先和*结合说明p为指针变量指向的是一个大小为10的整形数组因为[ ]的优先级要高于 * 因此不能省略。指针数组的初始化需要用到数组名int(*pa)arr;三、二维数组传参二维数组传参形参部分可以写成数组也可以写成指针的形式。二维数组我们可以看成是每个元素都是一个一维数组那么二维数组的数组名就是第一个数组的地址二维数组传参本质上也传递了地址传递的是第一个一维数组的地址。voidtest(inta[3][4]);//数组传参voidtest(int(*p)[4]);//指针传参四、函数指针变量函数指针变量是用于存放函数地址未来能够通过地址调用函数。函数名就是函数的地址我们可以通过函数名的方法获得函数的地址。那么我们要如何创建函数指针变量呢其实函数指针变量的写法其实和函数指针十分类似。voidtest(){printf(hello);}void(*pf1)()test;void(*pf2)()test;intAdd(intx,inty){returnxy;}int(*pf3)(intx,inty)Add;int(*pf4)(int,int)Add;//x和y写或不写都可以//我们可以通过函数指针调用指针指向的函数printf(%d,(*pf3)(1,2));printf(%d,pf3(3,4));当我们想要用typedef重命名变量时特别注意数组指针和函数指针的重命名。typedefint(*parr_t)[5];//数组指针新类型名写在*右边typedefvoid(*pfun_t)[int];当我们需要存放多个函数指针的时候就可以使用函数指针数组。定义如下int(*parr1[3])();该定义的意思是parr1先和[ ]结合表示这个是一个数组剩下的说明这个数组存放的是int(*)类型的函数指针。函数指针数组的用途是可以用于制作转移表代码如下#includestdio.hintadd(intx,inty){returnxy;}intsub(intx,inty){returnx-y;}intmul(intx,inty){returnx*y;}intdiv(intx.inty){returnx/y;}intmain(){intx,y;intinput1;intret0;do{printf(**************\n);printf(* 1:add 2:sub *\n);printf(* 3:mul 2:div *\n);printf(* 0:exit *\n);printf(**************\n);printf(请选择);scanf(%d,input);switch(input){case1:scanf(%d %d,x,y);retadd(x,y);printf(%d,ret);break;case2:scanf(%d %d,x,y);retsub(x,y);printf(%d,ret);break;case3:scanf(%d %d,x,y);retmul(x,y);printf(%d,ret);break;case4:scanf(%d %d,x,y);retdiv(x,y);printf(%d,ret);break;case0:printf(退出程序);break;default:printf(输入错误);break;}}while(input);return0;}使用转移表可以让我们少写一些代码。#includestdio.hintadd(intx,inty){returnxy;}intsub(intx,inty){returnx-y;}intmul(intx,inty){returnx*y;}intdiv(intx.inty){returnx/y;}intmain(){intx,y;intinput1;intret0;int(*parr[5])(int,int){0,add,sub,mul,div};do{printf(**************\n);printf(* 1:add 2:sub *\n);printf(* 3:mul 2:div *\n);printf(* 0:exit *\n);printf(**************\n);printf(请选择);scanf(%d,input);if(input4input1){scanf(%d %d,x,y);ret(*parr[input])(x,y);printf(%d,ret);}ifelse(input0){printf(程序结束)}else{printf(输入有误)}}while(input);return0;}总结以上就是指针中的内容希望能对大家有所帮助。

更多文章