【C语言】指针速览
指针速览
- 指针
- 1.野指针与空指针
- 2. 空类型指针 void *
- 3. 指针常量
- 4. 常量指针
- 5. 指向常量的指针常量
- 6. 指针操作数组
- 6.1 数组名作为函数参数
- 7. 多级指针
- 8. 函数指针
- 8.1 函数指针数组
- 最后
指针
指针就是内存的字节单元编号地址,指针变量就是存放地址的变量。
1.野指针与空指针
野指针是指,指针变量被赋值了一个随意的数值,这个数值并不是已知变量的内存地址,这个数值指向的区域未知,导致这个指针没有实际意义,如果对这个指针指向的内存区域进行操作还会导致错误。
例如下面都是野指针:
int *p;
p=0x12345678;//给指针变量赋值了一个随意的数值
*p=20; //对未知区域赋值,报错
//输出报错,段错误
Segmentation fault (core dumped)int a=123;
p=a; //给指针变量赋值了一个随意的数值
空指针是指指针变量没有指向任何变量,该指针变量空闲可用。用代码表示就是 该指针变量指向NULL。NULL是一个值为0的宏常量。
#define NULL ((void *)0)
//空指针
int *p=NULL;
2. 空类型指针 void *
void * 可以指向任何变量的内存空间,是一个万能指针。
//可以写成 void *p = NULL; 初始化//案例
void *p;
int a=100;
char c='W';p=NULL;
//p=(void *)&a;
p=&a;
printf("%d\n",*(int *)p); //输出100//p=(void *)&c;
p=&c;
printf("%c\n",*(char *)p); //输出W
3. 指针常量
意思是这个指针变量是一个常量,指向的地址不能改变,也就是指针变量的内容不能变,指向的值可以变;
int i = 9;
//指针常量
int *const p = &i;
//改变指向的值
*p = 3;
4. 常量指针
指针的指向可以变,指向的值不能变;
int i=9;
int j=10;
int const *p = &i; //或者const int *p = &i;
printf("%d\n",*p); //输出9
//*p=20; //修改指向的值,报错
p=&j; //修改指向
printf("%d\n",*p); //输出10
5. 指向常量的指针常量
既不能修改指向,又不能修改指向的值
int i = 9;
int const *const p = &i; //或者 const int const *p = &i;
6. 指针操作数组
数组名就是数组的地址。
int a[10]={1,2,3,4,5,6,7,8,9,0};
int len=sizeof(a)/sizeof(a[0]);
int i;
//方式一,使用i变量
for(i=0;i<len;i++)
{printf("%d,",*(a+i));
}
printf("\n");
//方式二,使用临时指针变量int *p=a;
for(i=0;i<len;i++)
{printf("%d,",*p);p++;
}//输出
1,2,3,4,5,6,7,8,9,0,
1,2,3,4,5,6,7,8,9,0,
6.1 数组名作为函数参数
void printArr(int *a,int len)
{int i;for(i=0;i<len;i++){printf("%d,", a[i]);//printf("%d,", *(a+i));}printf("\n");
}int main()
{int a[]={1,2,3,4,5};int len=sizeof(a)/sizeof(a[0]);printArr(a,len);return 0;
}
7. 多级指针
int m=10;
int *n=&m; //*n就是m
int **i=&n; //*i就是n,**i就是m
int ***j=&i; //*j就是i,**j就是n,***j就是mprintf("%d\n",*n); //10
printf("%d\n",**i); //10
printf("%d\n",***j); //10
8. 函数指针
函数名就是函数的地址,说明函数也是存在内存中的,可以利用它的地址调用函数。
函数指针可以指向同类型的函数,要求参数类型,返回值一样。
函数指针就是一个指针,指向的是一个函数。
#include <stdio.h>int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);int main()
{//定义一个函数指针,指向的函数返回值是int,参数是 int,int int(* pfun)(int a,int b)=NULL;//赋值//直接使用 pfun=sum; 也可以pfun=∑printf("%d\n",pfun(1,2)); //3pfun=&mul;printf("%d\n",pfun(4,2)); //8pfun=&des;printf("%d\n",pfun(5,3)); //2return 0;
}int sum(int a,int b)
{return a+b;
}int des(int a,int b)
{return a-b;
}int mul(int a,int b)
{return a*b;
}
8.1 函数指针数组
#include <stdio.h>int sum(int a,int b);
int des(int a,int b);
int mul(int a,int b);int main()
{//定义一个函数指针,指向的函数返回值是int,参数是 int,int int(* pfun[3])(int a,int b)={sum,des,mul};int i;for(i=0;i<3;i++){printf("%d\n",pfun[i](10,5));}return 0;
}int sum(int a,int b)
{return a+b;
}int des(int a,int b)
{return a-b;
}int mul(int a,int b)
{return a*b;
}//输出
15
5
50
最后
推荐一个零声教育学习教程,个人觉得老师讲得不错,分享给大家:[Linux,Nginx,ZeroMQ,MySQL,Redis,
fastdfs,MongoDB,ZK,流媒体,CDN,P2P,K8S,Docker,
TCP/IP,协程,DPDK等技术内容,点击立即学习:链接
相关文章:
【C语言】指针速览
指针速览 指针1.野指针与空指针2. 空类型指针 void *3. 指针常量4. 常量指针5. 指向常量的指针常量6. 指针操作数组6.1 数组名作为函数参数 7. 多级指针8. 函数指针8.1 函数指针数组 最后 指针 指针就是内存的字节单元编号地址,指针变量就是存放地址的变量。 1.野…...
Java基础学习:深入解析Java中的位运算符
在Java中,位运算符用于对整数类型的值进行位运算。以下是Java中的位运算符: 位与(&):两位都为1时,结果为1,否则为0。 位或(|):两位中有1个为1,结果为1。 位非(~):位的反&#…...

9.Redis之list类型
list相当于链表、数据表 1.list类型基本介绍 列表中的元素是有序的"有序"的含义,要根据上下文区分~~有的时候,谈到有序,指的是"升序","降序”有的时候,谈到的有序,指的是, 顺序很关键~~如果把元素位置颠倒,顺序调换.此时得到的新的 List 和之前的 Li…...

Git 的安装和使用
一、Git 的下载和安装 目录 一、Git 的下载和安装 1. git 的下载 2. 安装 二、Git 的基本使用-操作本地仓库 1 初始化仓库 1)创建一个空目录 2)git init 2 把文件添加到版本库 1)创建文件 2)git add . 3)g…...

大模型时代的具身智能系列专题(五)
stanford宋舒然团队 宋舒然是斯坦福大学的助理教授。在此之前,他曾是哥伦比亚大学的助理教授,是Columbia Artificial Intelligence and Robotics Lab的负责人。他的研究聚焦于计算机视觉和机器人技术。本科毕业于香港科技大学。 主题相关作品 diffusio…...

基于springboot+vue的社区医院管理服务系统
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...

车载电子电器架构 —— 智能座舱标准化意义
车载电子电器架构 —— 智能座舱标准化意义 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 屏蔽力是信息过载时代一个人的特殊竞争力,任何消…...
Compose在xml中使用滑动冲突处理
一、背景 在现有Android项目中使用Compose可能存在滑动冲突问题,例如 SmartRefreshLayoutCoordinatorLayoutComposeView(ComposeView这里又是一个LazyColumn) 二、解决方案 官方介绍:https://developer.android.google.cn/develop/ui/compose/touch-inp…...

微信网页版登录插件v1.1.1
说到如今的微信客户端,大家肯定会有很多提不完的意见或者建议。比如这几年体积越来越大,如果使用频率比较高,那占用空间就更离谱了。系统迷见过很多人电脑C盘空间爆满,都是由于微信PC版造成的。 而且,它还加了很多乱七…...

华为实训课笔记 2024
华为实训 5/205/215/225/235/275/28 5/20 5/21 5/22 5/23 5/27 5/28...

HTML静态网页成品作业(HTML+CSS)——宠物狗介绍网页(3个页面)
🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有3个页面。 二、作品演示 三、代…...

网络模型-路由策略
一、路由策略 路由策略(Routing Policy)作用于路由,主要实现了路由过滤和路由属性设置等功能,它通过改变路由属性(包括可达性)来改变网络流量所经过的路径。目的:设备在发布、接收和引入路由信息时,根据实际组网需要实施一些策略,…...
【MySQL精通之路】InnoDB(7)-锁和事务模型
1.InnoDB锁 【MySQL精通之路】InnoDB(7)-锁和事务模型(1)-锁-CSDN博客 2.InnoDB事务模型 【MySQL精通之路】InnoDB(7)-锁和事务模型(2)-事务模型-CSDN博客 3.InnoDB中不同SQL语句设置的锁 4.幻影行 5.InnoDB中的死锁 5.1InnoDB死锁示例 5.2死锁检测 …...

深度学习创新点不大但有效果,可以发论文吗?
深度学习中创新点比较小,但有效果,可以发论文吗?当然可以发,但如果想让编辑和审稿人眼前一亮,投中更高区位的论文,写作永远都是重要的。 那么怎样“讲故事”才能让论文更有吸引力?我总结了三点…...
【ARM Cache 系列文章 7.1 – ARMv8/v9 MMU 页表配置详细介绍 02 】
文章目录 Translation table descriptorTable descriptor format页面粒度和地址长度粒度(Granules)48位和52位地址TCR_ELx.DSVTCR_EL2.DSFEAT_LPA块描述符|页描述符紧接上篇文章【ARM Cache 系列文章 7 – ARMv8/v9 MMU 页表配置 01 】 Translation table descriptor</...

Mysql搭建主从同步,docker方式(一主一从)
服务器:两台Centos9 用Docker搭建主从 使用Docker拉取MySQL镜像 确保两台服务器都安装好了docker 安装docker请查看:Centos安装docker 1.两台服务器都先拉取mysql镜像 docker pull mysql 2.我这里是在 /opt/docker/mysql 下创建mysql的文件夹用来存…...

【已解决】使用token登录机制,token获取不到,blog_list.html界面加载不出来
Bug产生 今天使用token完成用户登录信息的存储的时候被卡了大半天。 因为登录的功能写的已经很多了,所以今天就没有写一点验一点,而是在写完获取博客列表功功能,验证完它的后端后,了解完令牌的基本使用以及Jwt的基本使用方式——…...

【Linux 网络编程】网络的基础知识详解!
文章目录 1. 计算机网络背景2. 认识 "协议" 1. 计算机网络背景 网络互联: 多台计算机连接在一起, 完成数据共享; 🍎局域网(LAN----Local Area Network): 计算机数量更多了, 通过交换机和路由器连接。 🍎 广域网WAN: 将…...

Nacos 2.x 系列【12】配置加密插件
文章目录 1. 前言2. 安装插件2.1 编译2.2 客户端2.3 服务端 3. 测试 1. 前言 为保证用户敏感配置数据的安全,Nacos提供了配置加密的新特性。降低了用户使用的风险,也不需要再对配置进行单独的加密处理。 前提条件: 版本:老版本暂时不兼容&…...

Kubernetes和Docker对不同OS和CPU架构的适配关系
Docker Docker官网对操作系统和CPU架构的适配关系图 对于其他发行版本,Docker官方表示没有测试或验证在相应衍生发行版本上的安装,并建议针对例如Debian、Ubuntu等衍生发行版本上使用官方的对应版本。 Kubernetes X86-64 ARM64 Debian系 √ √ Re…...

龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...

深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
ASP.NET Core 是一个跨平台的开源框架,用于在 Windows、macOS 或 Linux 上生成基于云的新式 Web 应用。 ASP.NET Core 中的日志记录 .NET 通过 ILogger API 支持高性能结构化日志记录,以帮助监视应用程序行为和诊断问题。 可以通过配置不同的记录提供程…...

shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...

人工智能(大型语言模型 LLMs)对不同学科的影响以及由此产生的新学习方式
今天是关于AI如何在教学中增强学生的学习体验,我把重要信息标红了。人文学科的价值被低估了 ⬇️ 转型与必要性 人工智能正在深刻地改变教育,这并非炒作,而是已经发生的巨大变革。教育机构和教育者不能忽视它,试图简单地禁止学生使…...

处理vxe-table 表尾数据是单独一个接口,表格tableData数据更新后,需要点击两下,表尾才是正确的
修改bug思路: 分别把 tabledata 和 表尾相关数据 console.log() 发现 更新数据先后顺序不对 settimeout延迟查询表格接口 ——测试可行 升级↑:async await 等接口返回后再开始下一个接口查询 ________________________________________________________…...
【Android】Android 开发 ADB 常用指令
查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

Chrome 浏览器前端与客户端双向通信实战
Chrome 前端(即页面 JS / Web UI)与客户端(C 后端)的交互机制,是 Chromium 架构中非常核心的一环。下面我将按常见场景,从通道、流程、技术栈几个角度做一套完整的分析,特别适合你这种在分析和改…...

mac:大模型系列测试
0 MAC 前几天经过学生优惠以及国补17K入手了mac studio,然后这两天亲自测试其模型行运用能力如何,是否支持微调、推理速度等能力。下面进入正文。 1 mac 与 unsloth 按照下面的进行安装以及测试,是可以跑通文章里面的代码。训练速度也是很快的。 注意…...
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析
Java求职者面试指南:Spring、Spring Boot、Spring MVC与MyBatis技术解析 一、第一轮基础概念问题 1. Spring框架的核心容器是什么?它的作用是什么? Spring框架的核心容器是IoC(控制反转)容器。它的主要作用是管理对…...