当前位置: 首页 > news >正文

C语言指针详解3

一.字符指针变量

在指针中有一种字符叫做char* 类型,字符类型指针既可以指向字符们也可以指向字符串(字符串首字符地址)(常用)。

1.1指向单个字符

int main() { char ch = 'w'; char* pc = &ch; *pc = 'w'; return 0; }

1.2指向字符串(指向字符串首字符地址)

代码示例:

#include <stdio.h> int main() { char* p = "abcdef";//"abcdef"是常量字符串, 这里的赋值是把首字符a的地址赋值给p printf("%c\n", *p);//打印a printf("%s\n", p);//打印整个字符串 return 0; }

1.3扩展-const修饰字符指针变量

#include <stdio.h> int main() { char str1[] = "hello cpp"; char str2[] = "hello cpp"; const char* str3 = "hello cppt."; const char* str4 = "hello cpp."; if (str1 == str2) printf("str1 and str2 are same\n");//a else printf("str1 and str2 are not same\n");//b if (str3 == str4) printf("str3 and str4 are same\n");//c else printf("str3 and str4 are not same\n");//d return 0; }

问:打印abcd中的那两个语句。

解答:str1和str2没有用const修饰,所以不是一个字符串,两者比的是起始地址(字符串首元素地址),所以str1 != str2,str3和str4用const修饰了,所以是同一条字符串,两者比较的是指针变量的内容,所以打印b c。

二.数组指针

2.1数组指针和指针数组的区别

数组指针是存放指针的数组。而之前提到的数组指针是一种指针变量。

写法:1.数组指针:int* p[10]

2.指针数组:int(*p)[10]

2.2数组指针的初始化

int main() { int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };//整型数组 int (*p)[10] = &arr; char ch[5] = { 'a', 'b' };//字符数组 char (*p2)[5] = &ch; return 0; }

三.二维数组传参的本质

要想知道二维数组传参的本质就要先知道二维数组的本质,二维数组的可以看作是一个由几个一维数组组成的数组,及二维数组的每个元素都是一维数组,那么二维数组的首元素即第一行,就是一个一维数组。

void print(int (*arr)[3], int row) { for (int i = 0; i < row; i++) { for (int j = 0; j < 3; j++) { printf("%d ", arr[i][j]); } printf("\n"); } } int main() { int arr[3][3] = { {1, 2, 3},{4, 5, 6},{7, 8, 9} }; // 数组名退化为行指针 int(*)[3] print(arr, 3); return 0; }

二维数组传参,形参部分可以写成数组,也可以向上面这个代码这样写成指针形式。

四.函数指针

3.1写法:int(*pf)(int x,int y)

拆解:int - 返回类型,(*pf3) - 函数指针变量名 ,(int x,int y) - 函数参数的类型和个数。

3.2函数指针的使用

#include <stdio.h> int sub(int x, int y) { return x - y; } int main() { int(*pf)(int, int) = sub; printf("%d\n", (*pf)(3,2)); printf("%d\n", pf(3, 5)); return 0; }

3.3函数指针的使用 - 转义表

举例:实现计算器

#include <stdio.h> int add(int x, int y) { return x + y; } int sub(int x, int y) { return x - y; } int mul(int x, int y) { return x * y; } int div(int x, int y) { return x / y; } int main() { int x, y; //用户输入的两个操作数。 int input = 1;//存储用户选择的操作内容,初始化为1。 int ret = 0;//存储运算结果。 //转移表,定义一个函数指针数组,用来存放加减乘除四个函数的地址。 int (*p[5])(int x, int y) = { 0, add, sub, mul, div }; // do-while循环:让程序可以重复运行,直到用户选择退出 do { // 打印菜单界面 printf("************************\n"); printf(" 1:add 2:sub \n"); printf(" 3:mul 4:div \n"); printf(" 0:exit \n"); printf("************************\n"); printf("请选择: "); scanf("%d", &input); // 读取用户输入的选项 // 如果用户选择的是1~4之间的运算 if ((input <= 4 && input >= 1)) { printf("输入操作数:"); scanf("%d %d", &x, &y); // 读取两个操作数 // 通过函数指针数组调用对应的运算函数 ret = (*p[input])(x, y); // 输出运算结果 printf("ret = %d\n", ret); } // 如果用户选择0,退出程序 else if (input == 0) { printf("退出计算器\n"); } // 输入的选项不在0~4范围内,提示错误 else { printf("输入有误\n"); } } while (input); // 只要input不为0,循环就会继续 return 0; }

七.typedef关键字

typedef 用于给已有数据类型起别名,简化复杂类型书写。

#include <stdio.h> typedef int Integer; // 给int起别名Integer int main() { Integer a = 10; printf("%d", a); return 0; }
http://www.gsyq.cn/news/1610764.html

相关文章:

  • 工作原理:其核心是一个两步过程。
  • Mineradio音乐播放器下载安装地址
  • 机顶盒B860AV2.1-M刷机攻略
  • 从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景
  • AI渐进编程之四:状态机如何约束 AI 的动作?
  • 【SI_GMSL2】深入了解示波器测试GMSL2眼图
  • openclaw 0512版本部署(ubuntu 26.04)
  • 怎么用一张图做产品视频?用 seedance2.0 快速生成 360 度动态视频实战教程
  • DAY 2 TIM定时器
  • 对称加密算法的扩散层(P盒)密码学指标详细介绍
  • 深入解析Hermes Agent:从Skill驱动架构到实战部署的AI Agent框架指南
  • 嵌入式音频开发实战:AU-60 全功能 DSP 语音模组一站式开发指南
  • 3个突破性技巧:如何用SRWE实现Windows窗口的实时魔法编辑
  • 揭秘AI写教材黑科技!低查重的AI教材生成,为教学助力
  • How To: Create A Word Document In Powershell – Part 1 – Opening The Document, Writing Some Text, Usi
  • Highcharts有版权吗?
  • TVA在具身智能全栈能力体系中的关键作用(6)
  • VMware虚拟机安装Ubuntu Linux:从零搭建开发环境的完整指南
  • 北方高寒矿区专网通信搭建要点,适配低温、粉尘、防爆严苛工况
  • 基于YOLOv8的船舶检测分类系统:从模型训练到部署的完整实践
  • 如何用Taskt实现零代码办公自动化:免费RPA工具完整指南
  • 3分钟终极指南:为Windows免费换上macOS专业鼠标指针
  • 极低成本 AI 服务:独立开发者的多模型混合路由与流量网关设计
  • AI渐进编程之五:给 Agent 穿上动力装甲——SIADOS 状态转移方法
  • 告别云服务器!用旧手机+Debian+AidLux,5分钟搭建你的移动AI开发环境
  • Claude Code从入门到精通(3)-settings.json 与 CLAUDE.md
  • XCOM 2模组管理器终极指南:如何用AML告别卡顿与冲突
  • Platinum-MD:如何让20年前的MiniDisc设备在现代电脑上重获新生?
  • JDBC基础(2)
  • 想提升用户体验?快把HTML5视频播放器代码嵌入你的网站