【C语言】指针的定义、概念和运用

2023-10-31

一、地址和指针的概念

【问题】数据在内存中是如何存储和读取的?
在程序中定义一个变量后,在对程序编译的时候,系统就会给这个变量分类内存单元。编译系统根据程序中定义的变量类型,分配一定长度的空间。例如:一般整型为2个字节,单精度浮点类型分类4个字节,对字符型分配一个字节。内存区的每一个字节有一个编号,这就是“地址”。
一定要弄清楚内存单元的地址域内存单元的内容这两个概念。以宾馆房间号为例,地址就是房间号,单元内容就是住在这个房间里的客人。在程序中一般通过变量名来对内存单元进行存取。其实,程序经过编译以后已经将变量名变为变量的地址,对变量值的存取都是通过地址进行的。
【直接 访问】
按照变量地址存取变量值的方式称为直接访问。
【间接访问】
将变量的地址存放在另一个变量中,它是一种特殊的变量,用于存放地址。
【总结】
在C语言中,将地址形象的称之为“指针”。意思是通过它能够找到以它为地位的内存单元。一个变量的地址称为“指针”。一个变量专门存放另一个变量地址的变量,称之为“指针变量”。指针是一个地址,为指针变量是存放地址的变量。

二、变量的指针和指向变量的指针变量

为了表示指针变量和它所指向变量之间的联系,在程序中用“*”符号表示“指向”的对象。如果已经定义i_pointer为指针变量,则(*i_pointer)是i_pointer所指向的变量。例:

  • i=3;
  • *i_pointer = 3;

1.定义一个指针变量

C语言规定,所有变量在使用前必须定义,指定其类型,并按照此分配内存单元。指针变量不同于整型变量和其它类型的变量,它是专门用来存放地址的,必须将它定义为“指针类型”。
int  i,j;
int *pointer_1,*pointer_2;
第一行定义了两个整型变量,第二行定义了两个指针便变量:pointer_1和pointer_2,它们是指向整型变量的指针变量。

怎样使一个指针变量指向另一个变量呢?
可以使用赋值语句是一个指针变量得到另一个变量的地址,从而使它指向该变量。

pointer_1 = &i;
pointer_2 = &j;

将变量i的地址放在指针变量pointer_1 中,因此pointer_1 就指向了变量i.
在定义指针时注意两点:

  • 指针变量前面的“*”便是该变量的类型为指针型变量。指针变量名是pointer_1和pointer_2。
  • 在定义指针变量时必须指定基类型。

2 指针变量的引用

指针变量只能存放地址,不要将一个整数赋值给一个指针变量。例“


```c
#include<stdio.h>
void main()
{int a,b;
 int *pointer_1,*pointer_2;
 a = 100;b = 10;
 pointer_1 = &a;
 pointer_2 = &b;
 printf("%d,%d\n",a,b);
 printf("%d,%d\n",*pointer_1,*pointer_2);
}

运行结果

100,10
100,10

3.指针变量作为函数参考

函数的参数不仅可以时整数、浮点型、字符型等数据,还可以时指针类型。它的作用是将一个变量的地址传到另一个函数中。例:

#include<stdio.h>
void main()
{void swap(int *p1,int *p2);    //函数的声明
 int a,b;
 int *pointer_1,*pointer_2;
 scanf("%d,%d\n",&a,&b)
 pointer_1 = &a; pointer_2 = &b;
 if(a<b) swap(pointer_1,*pointer_2); 
 printf("%d,%d\n",a,b);
}

void swap(int *p1,int *p2)
{ int temp;
  temp = *p1;
  *p1 = *p2;
  *p2 = temp;
}

运行结果:

5,9
9,5

形参值的改变不能使实参值发生改变。而应该用指针变量作为函数参数,在函数执行过程中使用指针变量所指向的变量值发生变化,这样就实现了”通过调用函数是变量的值发生变化,在主调函数中可以使用这些改变了的值‘的目的。
C语言中实参变量和形参变量之间的数据传递时单向的“值传递”。指针变量作为函数函数也要遵守这一规则。不可能通过调用函数来改变实参指针变量的值,但可以改变实参指针变量所指变量的值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【C语言】指针的定义、概念和运用 的相关文章

  • 没有强命名的代码签名是否会让您的应用程序容易被滥用?

    尝试了解authenticode代码签名和强命名 我是否正确地认为 如果我对引用一些 dll 非强命名 的 exe 进行代码签名 恶意用户就可以替换我的 DLL 并以看似由我签名但正在运行的方式分发应用程序他们的代码 假设这是真的 那么您似
  • 通过 CMIS (dotCMIS) 连接到 SP2010:异常未经授权

    我正在使用 dotCMIS 并且想要简单连接到我的 SP2010 服务器 我尝试用 C 来做到这一点 如下所示http chemistry apache org dotnet getting started with dotcmis htm
  • “构建”构建我的项目,“构建解决方案”则不构建

    我刚刚开始使用VS2010 我有一个较大的解决方案 已从 VS2008 成功迁移 我已将一个名为 Test 的控制台应用程序项目添加到解决方案中 选择构建 gt 构建解决方案不编译新项目 选择构建 gt 构建测试确实构建了项目 在失败的情况
  • GLKit的GLKMatrix“列专业”如何?

    前提A 当谈论线性存储器中的 列主 矩阵时 列被一个接一个地指定 使得存储器中的前 4 个条目对应于矩阵中的第一列 另一方面 行主 矩阵被理解为依次指定行 以便内存中的前 4 个条目指定矩阵的第一行 A GLKMatrix4看起来像这样 u
  • ASP.NET MVC:这个业务逻辑应该放在哪里?

    我正在开发我的第一个真正的 MVC 应用程序 并尝试遵循一般的 OOP 最佳实践 我正在将控制器中的一些简单业务逻辑重构到我的域模型中 我最近一直在阅读一些内容 很明显我应该将逻辑放在域模型实体类中的某个位置 以避免出现 贫血域模型 反模式
  • Asp.NET WebApi 中类似文件名称的路由

    是否可以在 ASP NET Web API 路由配置中添加一条路由 以允许处理看起来有点像文件名的 URL 我尝试添加以下条目WebApiConfig Register 但这不起作用 使用 URIapi foo 0de7ebfa 3a55
  • 使用实体框架模型输入安全密钥

    这是我今天的完美想法 Entity Framework 中的强类型 ID 动机 比较 ModelTypeA ID 和 ModelTypeB ID 总是 至少几乎 错误 为什么编译时不处理它 如果您使用每个请求示例 DbContext 那么很
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • C# 中通过 Process.Kill() 终止的进程的退出代码

    如果在我的 C 应用程序中 我正在创建一个可以正常终止或开始行为异常的子进程 在这种情况下 我通过调用 Process Kill 来终止它 但是 我想知道该进程是否已退出通常情况下 我知道我可以获得终止进程的错误代码 但是正常的退出代码是什
  • 带动态元素的 WPF 启动屏幕。如何?

    我是 WPF 新手 我需要一些帮助 我有一个加载缓慢的 WPF 应用程序 因此我显示启动屏幕作为权宜之计 但是 我希望能够在每次运行时更改屏幕 并在文本区域中显示不同的引言 这是一个生产力应用程序 所以我将使用非愚蠢但激励性的引言 当然 如
  • 创建链表而不将节点声明为指针

    我已经在谷歌和一些教科书上搜索了很长一段时间 我似乎无法理解为什么在构建链表时 节点需要是指针 例如 如果我有一个节点定义为 typedef struct Node int value struct Node next Node 为什么为了
  • 显示UnityWebRequest的进度

    我正在尝试使用下载 assetbundle统一网络请求 https docs unity3d com ScriptReference Networking UnityWebRequest GetAssetBundle html并显示进度 根
  • 使用 Bearer Token 访问 IdentityServer4 上受保护的 API

    我试图寻找此问题的解决方案 但尚未找到正确的搜索文本 我的问题是 如何配置我的 IdentityServer 以便它也可以接受 授权带有 BearerTokens 的 Api 请求 我已经配置并运行了 IdentityServer4 我还在
  • 使用 x509 证书签署 json 文档或字符串

    如何使用 x509 证书签署 json 文档或字符串 public static void fund string filePath C Users VIKAS Desktop Data xml Read the file XmlDocum
  • 如何使用 C# / .Net 将文件列表从 AWS S3 下载到我的设备?

    我希望下载存储在 S3 中的多个图像 但目前如果我只能下载一个就足够了 我有对象路径的信息 当我运行以下代码时 出现此错误 遇到错误 消息 读取对象时 访问被拒绝 我首先做一个亚马逊S3客户端基于我的密钥和访问配置的对象连接到服务器 然后创
  • 如何将带有 IP 地址的连接字符串放入 web.config 文件中?

    我们当前在 web config 文件中使用以下连接字符串 add name DBConnectionString connectionString Data Source ourServer Initial Catalog ourDB P
  • 如何在Xamarin中删除ViewTreeObserver?

    假设我需要获取并设置视图的高度 在 Android 中 众所周知 只有在绘制视图之后才能获取视图高度 如果您使用 Java 有很多答案 最著名的方法之一如下 取自这个答案 https stackoverflow com a 24035591
  • 基于 OpenCV 边缘的物体检测 C++

    我有一个应用程序 我必须检测场景中某些项目的存在 这些项目可以旋转并稍微缩放 更大或更小 我尝试过使用关键点检测器 但它们不够快且不够准确 因此 我决定首先使用 Canny 或更快的边缘检测算法 检测模板和搜索区域中的边缘 然后匹配边缘以查
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何在文本框中插入图像

    有没有办法在文本框中插入图像 我正在开发一个聊天应用程序 我想用图标图像更改值 等 但我找不到如何在文本框中插入图像 Thanks 如果您使用 RichTextBox 进行聊天 请查看Paste http msdn microsoft co

随机推荐

  • 【Linux】echo命令用法详解

    作者 柒号华仔 个人主页 欢迎访问我的主页 个人信条 星光不问赶路人 岁月不负有心人 个人方向 专注于5G领域 同时兼顾其他网络协议 编解码协议 C C linux等 感兴趣的小伙伴可以关注我 一起交流 目录 1 echo命令介绍 2 命令
  • 【Linux】——makefile

    文章目录 1 什么是makefile 2 makefile优势与make命令 3 makefile文件内容 3 1makefile文件的基础写法 3 2 makefile文件的优化 1 什么是makefile 在一个大型工程中 工程中的源文
  • 构建Python,Raspberry Pi和PostgreSQL数据服务器

    视频教程 PostgreSQL初学者 学习Raspberry Pi Linux初学者指南 在Raspberry Pi安装和设置PostgreSQL 前提 下载Raspbian 格式化SD卡 使用Disk Utility在macOS中格式化S
  • 自制番茄钟脚本

    Shell脚本 bin bash i 0 if 1 then t 25 60 else t 5 60 fi while i lt t do sleep 1 i 1 m t i 60 s t m 60 i echo en m s r done
  • parsing XML document from class path resource [applicationContext.xml]…

    方法 1 可能是缺失了resource文件 项目右键 Build Path Configure Build Path Java Build Path source Add Folder 将Resource添加应用 2 可能缺失了spring
  • SqliLab_Mysql_Injection详解_字符型注入(五)_时间盲注(8~10)

    文章目录 1 SqliLab Mysql Injection详解 字符型注入 五 1 1 SQL注入 时间盲注 1 1 1 原理 1 1 2 常用的函数 2 SqliLab关卡 包含8 9 10 图片占据空间太大 payload具体返回情况
  • [从零学习汇编语言] - 模块化程序设计

    文章目录 前言 回顾 一 模块化程序设计 1 1 子程序 1 2 子程序的参数和返回值 1 3 批量数据的传递 1 4 寄存器的冲突处理 结语 前言 点赞再看 养成习惯 回顾 还记得我们之前讲过的ret指令搭配call指令实现的子程序模板吗
  • SpringCache通过注解实现redis缓存

    1 SpringCache介绍 2 SpringCache常用注解 底层是基于map实现的 缺点 重启后数据就不存在了 在Spring Cache使用方式中将底层实现替换成了redis缓存技术 1 CachePut 参考演示 CachePu
  • Loading自定义指令

    目录 Loading自定义指令 一 介绍 二 自定义指令及使用 1 创建loading组件 2 自定义指令 3 main js中全局注册 4 使用 三 结果演示 Loading自定义指令 相关知识查看官方文档 自定义指令 一 介绍 通过v
  • mysql5.5 导入 mysql5.6 或者 mysql 5.7 的sql文件失败

    今天导入数据库的时候 一直失败 发现是mysql版本的问题 唉 难道不能向下兼容嘛 下面说解决方案 第一步 用nodepad 打开sql文件 第二部 按照下面方式进行全文替换 代表任意数字字符 datetime gt datetime TI
  • 一线大厂:从需求提出到上线流程总结

    在一线大厂 从需求提出到上线 整个流程是怎样的 笔者结合腾讯的工作流和调研了阿里 字节等公司的项目开发流程 发现大厂的工作流大同小异 总结了如下的整体流程图 下面将按照这个流程的每个节点 详细阐述 全文3000多字 阅读大概需要6分钟 目录
  • Struts2的国际化文件配置样式以及中文字体设置

    我来填坑划水来了 这次讲的是我在工程中通过在国际化文件中来设置样式 这样页面调用国际化的话 不用在页面控制字体样式 那国际化文件文件怎么设置字体样式呢 其实很简单就是用HTML实例 虽然我还没找到资料证明是HTML实例 只是按照工程常遇见的
  • Python深度学习实战PyQt5信号与槽的连接

    本文讲解信号与槽的连接机制 详细示范各种类型的信号 槽连接的实现方法 这是图形用户界面的核心内容 还将介绍面向对象的程序设计 这是图形用户界面的基本思想 目录 1 信号与槽 Signals and slots 信号与槽机制是 PyQt 的核
  • 《七》JavaScript 中的运算符和表达式

    运算符的综合运算顺序是 非运算符 gt 算术运算符 gt 比较运算符 gt 逻辑运算符 3 gt 2 8 gt 3 4 true 首先计算 3 4 等于 7 然后比较 3 gt 2 为 true 再比较 8 gt 7 为 true 最后 t
  • Ubuntu的终端重启命令

    Ubuntu的终端重启命令 终端命令重启 终端命令重启 自己记录一下 懒得搜了 shutdown h now 立即关机 shutdown h xx xx 到xx xx 具体时间 关机 如果该时间小于当前时间 则到隔天 shutdown h
  • Obsidian&FolderSync 创作格外丝滑

    简介 Obsidian is a powerful knowledge base on top of a local folder of plain text Markdown files A second brain for you fo
  • 命令...

    1 Git git stash 暂存本地的修改 git pull git branch a 可以查看所有本地分支和远程分支 git branch r 只查看远程分支 git fetch 在项目中更新gitlab上创建的分支 git push
  • 商城小程序源码开发搭建

    前言 随着移动互联网的快速发展 小程序成为了一种受欢迎的移动应用形式 在这一趋势下 商城小程序应运而生 为企业和个人提供了一种全新的商业模式 本文将重点介绍商城小程序源码及其应用价值 并为您提供几个常用的商城小程序源码示例 第一部分 商城小
  • vue使用elment的弹窗里面调用AMap.Autocomplete提示失效

    1 使用AMap Autocomplete提示失效 不是加载失效 是被弹窗的层级挡住了 这里面涉及到用了elment ui 的模态窗组件 我在自定义组件内通过深度选择器也没效果 需要全局引入 amap sug result z index
  • 【C语言】指针的定义、概念和运用

    一 地址和指针的概念 问题 数据在内存中是如何存储和读取的 在程序中定义一个变量后 在对程序编译的时候 系统就会给这个变量分类内存单元 编译系统根据程序中定义的变量类型 分配一定长度的空间 例如 一般整型为2个字节 单精度浮点类型分类4个字