C语言指针全解
1.什么是指针:
指针是存放地址的地方,是内存中最小单元的地址(编号),内存被分为一个个小的单元格,每一格有一个字节。比如说int a=0;a会占据四个字节的大小,每个字节对应单元格都有自己的编号,&a代表着第一个单元格的地址,用十六进制表示:0x0000006b2d1dfa34
2.指针变量的大小:
从上面我们得知指针是用来存放地址的地方,所以地址的长度决定了指针变量的大小。对于64位系统,每个地址长度是16位十六进制数(一个十六进制位恰好可以表示4位二进制位),所以需要4*16个比特位(二进制位),也就是4*16(地址所占比特位)/8(1字节所占比特位)=8字节,所以在64位系统中,指针变量的大小是8字节,而在32位系统中也可以得知是4个字节。
3.指针类型的问题引出:
在上面我们说明了指针变量是存放地址的地方,在64位系统之中都是由16为二进制数构成,而我们又知道,指针变量有不同的类型,如int*,double*,char*等等;现在就有一个疑问,指针大小是由地址长度确定的,需要这么多类型的指针类型干什么呢?接下来我们将对指针类型的意义进行探索。
4.不同指针类型的意义:
4.1指针类型决定了指针在算数运算时移动的单位。
比如如下代码:对于int*p1,p1+1移动的单位为4个字节;而char*p2,p2+1只移动了一个字节。这样的方便之处在于,可以对指针进行相应的算数运算来实现一些操作。比如数组的遍历,如果指针类型与对应的数据类型不匹配的话,就会导致指针所指向的地址出错,对应解引用也会出错。 
4.2指针类型决定指针解引用时访问的长度。比如如下代码:解应用的访问主要表现在两个方面:1.对于数据的修改 2.对于数据的打印。


从上面的结果可以看出,char*解引用只能访问1个字节(2个十六进制数)而int*可以访问4个字节(8个十六进制数)。
注:是否可以利用指针类型访问字节数相同,但是指针类型不相同的指针来解引用修改数据呢?比如float和int都是,答案是否定的,因为浮点数在内存中储存与整数不一样,
5.野指针:
"野指针"是一个非正式的术语,用于描述一个指向无效内存地址的指针。这种指针可能会引发未定义的行为,如程序崩溃、数据损坏等。以下几种情况可能会导致野指针的产生:
1.未初始化的指针:指针变量在声明后未被赋值,其值是不确定的;比如如下代码:int* p;*p = 0;p指向的地址是不确定的,对p解引用,虽然不报错,但是对于p我们无法掌控。
2.指针指向的内存被释放:当使用动态内存分配(如malloc)创建的内存被释放(如使用free)后或者函数内局部变量地址作为返回值使用,指向该内存的指针就变成了野指针。比如下列代码:a在执行完fun函数之后就会被销毁,此时再对于a进行解引用,就会产生野指针。
int* fun(void)
{int a = 0;return &a;
}
int main()
{int* p = fun();*p = 20;return 0;
}
3.指针越界:当指针访问数组或缓冲区之外的内存时,它也可能变成一个野指针。比如如下代码:

在实际使用中应该避免野指针的出现,对于指向地址位置的指针常常初始化为NULL
6.指针运算:
6.1.指针的关系运算,指针与地址比较常用于数组中,因为数组是一组连续的地址,且地址由低到高(这是地址比较的依据)。
6.2.指针的算术运算,如下面的代码:通过比较地址和对指针加减整数的操作实现了数组的初始化和打印。
int arr[] = {1,2,4,5,6,10,25,78,99,100};
int* p = arr;
int sz = sizeof(arr)/sizeof(arr[0]);
//将数组中的元素全部初始化为0
for (int i = 0; p < &arr[sz]; p++)
{*p = i;
}
//此时p指向的是数组中的最后一个元素的后一个地址
//所以p--指向最后一个元素
p--;
for (; p >= &arr[0]; p--)
{printf("%d ", *p);
}
6.3.指针(地址)之间的运算:对于指向同一数组不同元素的指针(地址),两个指针(地址)差的绝对值是两者之间的元素个数。如下 列代码:
int arr[10] = {1,2,4,5,6,10,25,78,99,100};
printf("%d", &arr[9] - &arr[0]);
//打印结果为9
该特性是对于内存的直接应用。比如下列代码:
int my_strlen(char* str)
{char* start = str;while (*str != '\0'){str++;}return str - start;
}
int main()
{printf("%d", my_strlen("abcdef"));return 0;
}
7.二级指针:
存放一级指针变量地址的指针变量。需要注意的就是,二级指针可以进行两次解引用,分别对应有不同的意义。比如下列代码:
int a = 0,b=0;
int* p = &a;
int** pp = &p;
**pp = 20;//两次解引用可以访问到a的地址
*pp = &b; //一次解引用可以访问到b的地址
**pp = 10;
printf("%d\n", a);//结果:20
printf("%d", b); //结果:10
8.指针数组:
存放地址的数组。这里只介绍其简单的应用,如下列代码:将三个数组地址存放在一个指针数组中,从而联系起来。
int arr[5];
int brr[5];
int crr[5];
//指针数组,存放地址
int* prr[3] = { arr,brr,crr };
for (int i = 0; i < 3; i++)
{for (int j = 0; j < 5; j++){//prr[i]代表访问prr数组中下标为i的元素(地址)//比如prr[0]<==>arr,相当于直接替换//prr[0][j]<==>arr[j]//通过指针数组将三个不相关的数组联系起来prr[i][j] = 0;}
}
for (int i = 0; i < 3; i++)
{for (int j = 0; j < 5; j++){printf("%d ", prr[i][j]);}printf("\n");
}
相关文章:
C语言指针全解
1.什么是指针: 指针是存放地址的地方,是内存中最小单元的地址(编号),内存被分为一个个小的单元格,每一格有一个字节。比如说int a0;a会占据四个字节的大小,每个字节对应单元格都有自…...
rtt设备io框架面向对象学习-看门狗设备
1.看门狗设备基类 / components / drivers / include / drivers /下的watchdog.h 定义了如下看门狗设备基类 struct rt_watchdog_device { struct rt_device parent; const struct rt_watchdog_ops *ops; }; 看门狗设备基类的方法定义如下 struct rt_watchdog_ops { rt_err_…...
加固平板电脑丨三防智能平板丨工业加固平板丨智能城市管理
随着智能城市的不断发展,人们对于城市管理的要求也在不断提高,这就需要高效、智能的城市管理平台来实现。而三防平板就是一款可以满足这一需求的智能设备。 三防平板是一种集防水、防尘、防摔于一体的智能平板电脑,它可以在复杂的环境下稳定运…...
Redis的配置文件
目录 前言: 一、 Units 二、 INCLUDES 三、 NETWORK 3.1 bind 3.2 protected-mode 3.3 port 3.4 tcp-backlog 3.5 timeout 3.6 tcp-keepalive 3.7 示例演示 四、 GENERAL 4.1 daemonize 4.2 pidfile 4.3 loglevel 4.4 logfile 4.5 databases 五、…...
懒人精灵 之 Lua 捕获 json解析异常 ,造成的脚本停止.
Time: 2024年2月8日20:21:17 by:MemoryErHero 1 异常代码 Expected value but found T_END at character 12 异常代码 Expected value but found T_OBJ_END at character 223 处理方案 - 正确 json 示范 while true do--Expected value but found T_END at character 1--Ex…...
Python 列表操作详解
Python 是一种流行的编程语言,它以其简洁的语法和强大的功能而闻名。在 Python 中,列表是一种常用的数据结构,它可以包含任意类型的元素,并且可以随时添加或删除元素。在这篇文章中,我们将详细介绍 Python 列表的一些常…...
【Jenkins】Jenkins关闭Jenkins关闭、重启
目录 一、Jenkins关闭、重启 二、Jenkins服务的启动、停止方法。 一、Jenkins关闭、重启 1.关闭Jenkins 只需要在访问jenkins服务器的网址url地址后加上exit,关闭Jenkins服务。 例如:http://localhost:8081/exit 2.重启Jenkies 只有在Jenkins服务启动…...
【Linux】学习-动静态库
动静态库 头文件与库的区别 头文件一般而言,是声明和宏定义。头文件是在预处理阶段使用的 库文件是已经编译好的二进制代码。是一种目标文件,库文件是在链接阶段使用的 对于头文件和库我们可以这样理解,就是头文件提供的是一个函数的声明&…...
人工智能之数学基础【最小二乘法】
原理 最小二乘法由勒让德(A.M.Legendre)于1805年在其著作《计算彗星轨道的新方法》中提出,主要思想是最小化误差二次方和寻找数据的最佳匹配函数,利用最小二乘法求解未知参数,使得理论值与观测值之差(即误差,或称为残差)的二次方和达到最小,即: E = ∑ i = 1 n ϵ …...
【Java安全】ysoserial-URLDNS链分析
前言 Java安全中经常会提到反序列化,一个将Java对象转换为字节序列传输(或保存)并在接收字节序列后反序列化为Java对象的机制,在传输(或保存)的过程中,恶意攻击者能够将传输的字节序列替换为恶…...
Nginx报错合集(502 Bad Gateway,504 Gateway nginx/1.18.0 (Ubuntu) 等等报错)
1.504 Gateway Time-outnginx/1.18.0 (Ubuntu) 日志报错: 2024/02/11 04:38:54 [error] 564#564: *29 upstream timed out (110: Connection timed out) while reading response header from upstream, client: *******, server: *******, request: "GE…...
Rust开发WASM,WASM Runtime运行
安装wasm runtime curl https://wasmtime.dev/install.sh -sSf | bash 查看wasmtime的安装路径 安装target rustup target add wasm32-wasi 创建测试工程 cargo new wasm_wasi_demo 编译工程 cargo build --target wasm32-wasi 运行 wasmtime ./target/wasm32-wasi/d…...
快速重启网络服务 IP Helper
有时候,因为需要配置虚拟机,又或者网络环境复杂的情况下。win10重启后,会造成网络服务失效。所以这时候需要重启网络服务。即重启IP Helper。每次 我的电脑->鼠标右键 管理->服务和应用程序->服务->IP Helper 右键重启࿰…...
【MySQL】MySQL函数学习和总结
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:“没有罗马,那就自己创造罗马~” #mermaid-svg-Ny0xnYjfHqF7s3aS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-siz…...
MySQL进阶查询篇(7)-触发器的创建和使用
MySQL数据库触发器的创建和使用 触发器(Trigger)是MySQL数据库中非常强大且有用的功能,它可以在特定的数据库事件发生时自动执行一段预定义的代码。触发器可以用于实现数据完整性约束、自动化业务逻辑、审计日志等功能。本文将介绍MySQL数据库中触发器的创建和使用…...
前端面试题——JS实现反转链式表
前言 反转单向链表就是将整个单链表的数据进行倒序的过程。 例如,如果反转之前的单链表是0->1->2->3,那么反转之后的单链表应该是3->2->1->0。这个操作通常是通过改变链表中每个节点的指针方向来实现的,即让每个节点的指…...
小周带你正确理解Prompt-engineering,RAG,fine-tuning工程化的地位和意义
有人会说:"小周,几天不见这么拉了,现在别说算法了,连code都不讲了,整上方法论了。" 我并没有拉!而且方法论很重要,尤其工程化的时候,你总得知道每种技术到底适合干啥&…...
【精选】java多态进阶——多态练习测试
🍬 博主介绍👨🎓 博主介绍:大家好,我是 hacker-routing ,很高兴认识大家~ ✨主攻领域:【渗透领域】【应急响应】 【python】 【VulnHub靶场复现】【面试分析】 🎉点赞➕评论➕收藏…...
Git详细讲解
文章目录 一、Git相关概念二、本地分支中文件的添加 、提交2.1 文件状态2.2 创建Git仓库2.2.1 git init2.2.2 git clone 2.3 添加操作(git add)2.4 提交操作(git commit)2.5 撤销操作2.5.1 撤销 add操作2.5.2 撤销 commit操作2.5.3 覆盖上一次的commit操…...
k8s弃用docker后使用ctr导入镜像
很多公司的k8s安装比较早,在生产环境一般很少升级,因此还是老版本,在使用新版本的时候,容易陷入老版本的思维中,从而掉坑,这里记录一下整个排查过程,希望对遇到类似的同学起到一定的帮助。 k8s 抛弃弃用docker 学习容器技术的过程中,我看到有不少同学留言问 Kubernet…...
shell脚本--常见案例
1、自动备份文件或目录 2、批量重命名文件 3、查找并删除指定名称的文件: 4、批量删除文件 5、查找并替换文件内容 6、批量创建文件 7、创建文件夹并移动文件 8、在文件夹中查找文件...
【位运算】消失的两个数字(hard)
消失的两个数字(hard) 题⽬描述:解法(位运算):Java 算法代码:更简便代码 题⽬链接:⾯试题 17.19. 消失的两个数字 题⽬描述: 给定⼀个数组,包含从 1 到 N 所有…...
可靠性+灵活性:电力载波技术在楼宇自控中的核心价值
可靠性灵活性:电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中,电力载波技术(PLC)凭借其独特的优势,正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据,无需额外布…...
ServerTrust 并非唯一
NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...
鱼香ros docker配置镜像报错:https://registry-1.docker.io/v2/
使用鱼香ros一件安装docker时的https://registry-1.docker.io/v2/问题 一键安装指令 wget http://fishros.com/install -O fishros && . fishros出现问题:docker pull 失败 网络不同,需要使用镜像源 按照如下步骤操作 sudo vi /etc/docker/dae…...
MySQL账号权限管理指南:安全创建账户与精细授权技巧
在MySQL数据库管理中,合理创建用户账号并分配精确权限是保障数据安全的核心环节。直接使用root账号进行所有操作不仅危险且难以审计操作行为。今天我们来全面解析MySQL账号创建与权限分配的专业方法。 一、为何需要创建独立账号? 最小权限原则…...
Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信
文章目录 Linux C语言网络编程详细入门教程:如何一步步实现TCP服务端与客户端通信前言一、网络通信基础概念二、服务端与客户端的完整流程图解三、每一步的详细讲解和代码示例1. 创建Socket(服务端和客户端都要)2. 绑定本地地址和端口&#x…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 1.C语言的va_list展开可变参数 #include <iostream> #include <cstdarg>void printNumbers(int count, ...) {// 声明va_list类型的变量va_list args;// 使用va_start将可变参数写入变量argsva_start(args, count);for (in…...
vue3 daterange正则踩坑
<el-form-item label"空置时间" prop"vacantTime"> <el-date-picker v-model"form.vacantTime" type"daterange" start-placeholder"开始日期" end-placeholder"结束日期" clearable :editable"fal…...
