C 语言指针
C 语言指针
在本教程中,您将学习指针。什么是指针,如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。
指针是 C和C ++ 编程的强大功能。在学习指针之前,让我们学习一下C语言编程中的地址。
C 语言地址
如果程序中有变量var,则&var将在内存中提供其地址。
使用scanf()函数时,我们已多次使用地址。
scanf("%d", &var);
在此,用户输入的值存储在var变量的地址中。让我们举一个可行的实例。
#include <stdio.h>
int main()
{int var = 5;printf("var: %d\n", var);// 注意在var之前使用&printf("address of var: %p", &var); return 0;
}
输出结果
var: 5
var地址: 2686778
**注意:**运行上面的代码时,您可能会获得其他地址。
C 语言指针
指针(指针变量)是用于存储地址而非值的特殊变量。
指针语法
这是我们如何声明指针的方法。
int* p;c
在这里,我们已经声明了一个int类型的指针p。
您也可以通过以下方式声明指针。
int *p1;
int * p2;
让我们再举一个声明指针的实例。
int* p1, p2;
在这里,我们声明了一个指针p1和一个普通变量p2。
给指针分配地址
让我们举个实例。
int* pc, c;
c = 5;
pc = &c;
在此,将5分配给c变量。并且,将c的地址分配给pc指针。
获取指针所指向的值
为了获得指针所指向的内容的值,我们使用了解引用运算符(*)。例如:
int* pc, c;
c = 5;
pc = &c;
printf("%d", *pc); // 输出: 5
此处,c的地址已分配给pc指针。为了获取存储在该地址中的值,我们使用了*pc。
改变指针指向的值
让我们举个实例。
int* pc, c;
c = 5;
pc = &c;
c = 1;
printf("%d", c); // 输出: 1
printf("%d", *pc); // 输出: 1
我们已经将c地址分配给了pc指针。
然后,我们将的值更改c为1。由于pc和的地址c相同,因此*pc得到1。
让我们再举一个实例。
int* pc, c;
c = 5;
pc = &c;
*pc = 1;
printf("%d", *pc); // 输出: 1
printf("%d", c); // 输出: 1
我们已经将c地址分配给了pc指针。
然后,我们使用* pc = 1;将* pc更改为1。 由于pc和c的地址相同,因此c等于1。
让我们再举一个实例。
int* pc, c, d;
c = 5;
d = -15;pc = &c; printf("%d", *pc); // 输出: 5
pc = &d; printf("%d", *pc); // 输出: -15
最初,使用的地址c分配给pc指针pc = &c;。因为c是5,所以*pc给我们5。
然后,使用将地址d分配给pc指针pc = &d;。由于d是-15,所以*pc给我们-15。
示例:指针的工作方式
让我们举一个可行的实例。
#include <stdio.h>
int main()
{int* pc, c;c = 22;printf("c的地址: %p\n", &c);printf("c的值: %d\n\n", c); // 22pc = &c;printf("指针pc地址: %p\n", pc);printf("指针pc内容: %d\n\n", *pc); // 22c = 11;printf("指针pc地址: %p\n", pc);printf("指针pc内容: %d\n\n", *pc); // 11*pc = 2;printf("c的地址: %p\n", &c);printf("c的值: %d\n\n", c); // 2return 0;
}
输出结果
c的地址: 003FFBF8
c的值: 22指针pc地址: 003FFBF8
指针pc内容: 22指针pc地址: 003FFBF8
指针pc内容: 11c的地址: 003FFBF8
c的值: 2
该程序的用法
-
int* pc, c;
这里创建了一个指针pc和一个普通变量c,都是int类型。由于pc和c没有初始化在最初,指针pc指向没有地址或一个随机地址。变量c有一个地址,但包含随机的垃圾值。 -
c = 22;
这是给变量c赋值22,也就是说,22被存储在变量c的内存中。 -
pc = &c;
这将变量c的地址分配给指针pc。 -
c = 11;
这将11分配给变量c。 -
*pc = 2;
这会将指针pc指向的内存位置的值更改为2。
使用指针时的常见错误
假设您希望指针pc指向c的地址。 然后,
int c, *pc;//pc是地址,但c不是
pc = c; // Error//&c是地址,但* pc不是
*pc = &c; // Error//&c和pc都是地址
pc = &c;//c和*pc值
*pc = c;
这是指针语法初学者经常会感到困惑的示例。
#include <stdio.h>
int main() {int c = 5;int *p = &c;printf("%d", *p); // 5return 0;
}
使用时为什么没有出现错误int *p = &c;?
这是因为
int *p = &c;
相当于
int *p:
p = &c;
在这两种情况下,我们都创建了一个指针p(不是*p)并给它赋值&c。
为了避免这种混乱,我们可以使用如下语句:
int* p = &c;
现在您知道了什么是指针,您将在下一个教程中学习指针与数组的关系。
相关文章:

C 语言指针
C 语言指针 在本教程中,您将学习指针。什么是指针,如何使用它们以及在示例的帮助下使用它们时可能遇到的常见错误。 指针是 C和C 编程的强大功能。在学习指针之前,让我们学习一下C语言编程中的地址。 C 语言地址 如果程序中有变量var&am…...

学【Java多态】-- 写高质量代码
多态的实现条件 在java中要实现,必须要满足如下几个条件,缺一不可。 1.必须在继承体系下2.子类必须要对父类中的方法进行重写3.通过父类的引用调用冲写的方法。 想要真正的学好多态需要去学习一些前置知识,那我们直接开始吧! …...

【汇编】内存的读写与地址空间、寄存器及数据存储
文章目录 前言一、CPU对存储器的读写1.1 cpu对存储器的读写如何进行?1.2 演示 二、内存地址空间三、将各类存储器看作一个逻辑存储器——统一编址内存地址空间的分配方案 三、CPU的组成寄存器是CPU内部的信息存储单元通用寄存器--AX为例“横看成岭侧成峰“ 四、“字…...

DSP生成hex方法
以下使用两种方法生成的HEX文件,亲测可用 (1)万能法 不管.out文件是哪个版本CCS编译器生成的,只要用HEX2000.exe软件,翻译都可以使用。方法: hex2000 -romwidth 16 -memwidth 16 -i -o 20170817chuankou…...

GZ038 物联网应用开发赛题第7套
2023年全国职业院校技能大赛 高职组 物联网应用开发 任 务 书 (第7套卷) 工位号:______________ 第一部分 竞赛须知 一、竞赛要求 1、正确使用工具,操作安全规范; 2、竞赛过程中如有异议,可向现场考评…...

ELK之Logstash解析时间相差8h的问题
一、问题描述 服务器当前时间为:2022年 06月 28日 星期二 11:24:22 CST 而logstash解析的时间为2022-06-28T03:15:25.545Z与实际时间相差8h 一、解决办法: 需改logstash的配置文件: 原理就是:定义一个中间变量timestamp&…...

uniapp+vite+vue3开发跨平台app,运行到安卓模拟器调试方法
因为没有使用hbuilder开发uniapp,而是使用了vscode和vite来开发的,所以怎么将这个程序运行到安卓模拟器调试开发呢?其实方法很简单,使用android studio创建一个模拟器或者其他mumu模拟器,然后将项目使用hbuilder打开&a…...

Ubuntu诞生已经19年了
导读2004 年 10 月 20 日,Ubuntu 4.10 正式发布,代号‘Warty Warthog’。 2004 年 10 月 20 日,Ubuntu 4.10 正式发布,代号‘Warty Warthog’。 ▲ Ubuntu 4.10 与最新版 Ubuntu 23.10 的对比 作为 Ubuntu 第一个版本࿰…...

跟着基金买,别墅靠大海?买基金重仓股票,会破产吗?| 附最新选股结果
2020年A股经历了一波结构性牛市。 抱团核心资产的公募基金历史性大赚2万亿,一跃成为全市场顶流。不仅常年霸榜热搜,甚至连游戏直播的弹幕都在讨论基金。 很多年轻人也纷纷跑步入场,毕竟支付宝买基金贼方便。 可惜好景不长,大盘急…...

【教3妹学编辑-mysql】mybatis查询条件遇到的坑及解决方案
2哥 :3妹,今天怎么下班这么晚啊。 3妹:嗨,别提了,今天线上出bug了, 排查了好久。 2哥:啊,什么问题呀? 3妹:我们内部的一个管理系统报错了, 最近排查下来是myb…...

032-从零搭建微服务-定时服务(一)
写在最前 如果这个项目让你有所收获,记得 Star 关注哦,这对我是非常不错的鼓励与支持。 源码地址(后端):mingyue: 🎉 基于 Spring Boot、Spring Cloud & Alibaba 的分布式微服务架构基础服务中心 源…...
精通Nginx(11)-缓存
缓存能够存储请求的响应结果,以供未来再次使用,进而加速内容的提供。内容缓存可以缓存完整的响应,减少上游服务器的负载,避免了每次都为相同的请求重新运行计算和查询的麻烦。缓存可以提高性能并减少负载,这意味着可以用更少的资源更快地提供服务。NGINX 允许在NGINX 服务…...

用excel计算矩阵的乘积
例如,我们要计算两个矩阵的乘积, 第一个矩阵是2*2的: 1234 第2个矩阵是2*3的: 5697810 在excel中鼠标点到其它空白的地方,用来存放矩阵相乘的结果: 选择插入-》函数: 选中MMULT,…...
【微软技术栈】C#.NET 中使用依赖注入
本文内容 先决条件创建新的控制台应用程序添加接口添加默认实现添加需要 DI 的服务为 DI 注册服务结束语 本文介绍如何在 .NET 中使用依赖注入 (DI)。 借助 Microsoft 扩展,可通过添加服务并在 IServiceCollection 中配置这些服务来管理 DI。 IHost 接口会公开 IS…...

开启学历新征程,电大搜题助您轻松获取知识
作为一名电大学者,有肩负着传递真实信息、宣传正面价值的使命,而今天我要向您介绍的是一款非常实用的学习工具——电大搜题微信公众号。通过该平台,您可以获得更多关于浙江开放大学和广播电视大学的学习资源,助您在学习和工作上取…...

Redis 安装
前言 为什么需要学习如何安装Redis? 学习如何安装Redis对于软件开发人员来说是非常重要的,这是因为: 高效数据存储:Redis是一种高性能的键值存储系统,能够快速地存储和检索数据。学会安装Redis可以让开发人员和系统管…...
Windows GitBash解决Github添加密钥时提示Key is already in use的问题
通过添加多密钥实现 ssh-agent bashssh-keygen -t rsa -C ‘xx1’ -f ~/.ssh/id_rsa_xx1ssh-keygen -t rsa -C ‘xx2’ -f ~/.ssh/id_rsa_xx2ssh-add id_rsa_xx1ssh-add id_rsa_xx2 vim ~/.ssh/config Host github_xx1HostName github.comUser gitIdentityFile ~/.ssh/id_rs…...

第1关:简单查询
任务描述相关知识 检索数据表的内容编程要求测试说明 任务描述 本关任务: 用 SELECT 语句检索数据表中指定字段的数据; 用 SELECT 语句检索数据表中所有字段的数据。 相关知识 为了完成本关任务,你需要掌握:1.如何获取数据表…...
Android设计模式--Builder建造者模式
一,定义 Builder模式是一步一步创建一个复杂对象的创建型模式,它允许用户在不知道内部构建细节的情况下,可以更精细的控制对象的构造流程。 也就是将一个对象的构建与它的表示分离,使得同样的构建过程可以创建不同的表示。 二&…...

css实现鼠标悬停时元素的显示与隐藏
css实现鼠标悬停时元素的显示与隐藏 跟着B站黑马学习小兔鲜项目,有个点记录一下 就是当鼠标悬浮在商品列表上时,列表中的商品会显示出来,离开时,商品隐藏,如下: 感觉这个功能经常会遇到,但一直…...
从零实现富文本编辑器#5-编辑器选区模型的状态结构表达
先前我们总结了浏览器选区模型的交互策略,并且实现了基本的选区操作,还调研了自绘选区的实现。那么相对的,我们还需要设计编辑器的选区表达,也可以称为模型选区。编辑器中应用变更时的操作范围,就是以模型选区为基准来…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端
🌟 什么是 MCP? 模型控制协议 (MCP) 是一种创新的协议,旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议,它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

HTML 列表、表格、表单
1 列表标签 作用:布局内容排列整齐的区域 列表分类:无序列表、有序列表、定义列表。 例如: 1.1 无序列表 标签:ul 嵌套 li,ul是无序列表,li是列表条目。 注意事项: ul 标签里面只能包裹 li…...

html css js网页制作成品——HTML+CSS榴莲商城网页设计(4页)附源码
目录 一、👨🎓网站题目 二、✍️网站描述 三、📚网站介绍 四、🌐网站效果 五、🪓 代码实现 🧱HTML 六、🥇 如何让学习不再盲目 七、🎁更多干货 一、👨…...

代码规范和架构【立芯理论一】(2025.06.08)
1、代码规范的目标 代码简洁精炼、美观,可持续性好高效率高复用,可移植性好高内聚,低耦合没有冗余规范性,代码有规可循,可以看出自己当时的思考过程特殊排版,特殊语法,特殊指令,必须…...
省略号和可变参数模板
本文主要介绍如何展开可变参数的参数包 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…...
BLEU评分:机器翻译质量评估的黄金标准
BLEU评分:机器翻译质量评估的黄金标准 1. 引言 在自然语言处理(NLP)领域,衡量一个机器翻译模型的性能至关重要。BLEU (Bilingual Evaluation Understudy) 作为一种自动化评估指标,自2002年由IBM的Kishore Papineni等人提出以来,…...

c++第七天 继承与派生2
这一篇文章主要内容是 派生类构造函数与析构函数 在派生类中重写基类成员 以及多继承 第一部分:派生类构造函数与析构函数 当创建一个派生类对象时,基类成员是如何初始化的? 1.当派生类对象创建的时候,基类成员的初始化顺序 …...

Linux 下 DMA 内存映射浅析
序 系统 I/O 设备驱动程序通常调用其特定子系统的接口为 DMA 分配内存,但最终会调到 DMA 子系统的dma_alloc_coherent()/dma_alloc_attrs() 等接口。 关于 dma_alloc_coherent 接口详细的代码讲解、调用流程,可以参考这篇文章,我觉得写的非常…...

数据结构第5章:树和二叉树完全指南(自整理详细图文笔记)
名人说:莫道桑榆晚,为霞尚满天。——刘禹锡(刘梦得,诗豪) 原创笔记:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 上一篇:《数据结构第4章 数组和广义表》…...