【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语言】指针的定义、概念和运用 的相关文章

随机推荐

  • 【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个字