当前位置: 首页 > 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.jsqmd.com/news/1098801/

相关文章:

  • TVA:连接数字与物理世界的智能底座(5)
  • 工作原理:其核心是一个两步过程。
  • 防火墙Web界面配置一对一IPSec隧道:从原理到实战详解
  • Mineradio音乐播放器下载安装地址
  • 机顶盒B860AV2.1-M刷机攻略
  • 从 ABAP 后端到 AEX,Local Integration Engine 下的 Business System 配置全景
  • VR-Reversal:3D视频转2D的神奇工具,让沉浸式体验触手可及
  • AI渐进编程之四:状态机如何约束 AI 的动作?
  • WAF核心原理、部署模式与防护实战:从SQL注入到命令执行的安全防线
  • QoS详解:服务质量,如何优先保障关键业务的网络带宽
  • 【SI_GMSL2】深入了解示波器测试GMSL2眼图
  • 免费的Windows硬件检测工具合集,101款检测工具一站集齐,小白也能轻松上手 图吧工具箱Win UI3版
  • 软件:STM32-F1系列-EXTI外部中断demo(2026/6/28)
  • rac磁盘组扩容
  • 保姆级教程:给韦东山IMX6ULL开发板编译并安装RTL8723BU网卡驱动(附完整命令)
  • 用 Configuration Wizard 打好 ESR 的地基,SAP PI 与 PO 安装后的基础配置怎么做才稳
  • EfficientNet PyTorch终极指南:高效图像分类的完整解决方案
  • 为 ES Repository 到 CMS 传输单独定义通信用户,SAP PI 老架构里一个很小却很关键的安全开关
  • 若依多模块 Maven 项目架构实战:从单体到模块化
  • 《悬浮窗效果》二、Interface_WindowStage使用指南
  • openclaw 0512版本部署(ubuntu 26.04)
  • 泰戈尔的诗歌2
  • Kimi LeetCode 3420. 统计 K 次操作以内得到非递减子数组的数目 C++实现
  • 终极Unity游戏汉化指南:XUnity自动翻译器让外语游戏无障碍畅玩
  • 浅析NVMe协议:PRP/SGL数据传输格式
  • 怎么用一张图做产品视频?用 seedance2.0 快速生成 360 度动态视频实战教程
  • DAY 2 TIM定时器
  • 移动语义与容器极致优化,emplace/push底层差异、对象复用、std::allocator原理、自定义STL分配器实战
  • 对称加密算法的扩散层(P盒)密码学指标详细介绍
  • C++开发者如何学好汇编(上)