理解C语言指针概念只需几分钟

280318da8099bc71e8822a64f21ad45d.png

点击上方蓝字关注我,了解更多咨询

7517e2315be3aee47e2f46ed9fab998a.png

当我们声明一个变量或常量时,计算机系统会为这个变量或常量分配存储单元,变量的数据存储到被分配的存储单元内,对变量的赋值和取值操作都是针对存储单元的操作。

C编译器是如何通过变量找到与其对应的存储单元呢?实际上变量是被分配单元内存地址的名称,对开发者来说,记住一个变量名称要比记住用十六进制表示的内存单元地址更加简单,因此变量是内存单元地址的名称表示,开发者可以通过变量名来访问内存单元中的数据。下图给出了变量、数据和内存地址之间的关系。

2ab96df81a8c86c922f5140b160f01ad.png

我们知道“&”运算符是获取变量的内存地址,下面做一个实验,连续声明三个整型变量a、b、c,然后使用“&”运算符取出变量a、b、c的内存地址并输出到控制台。

#include <stdio.h>
void main()
{int a = 20,b=10,c=0;
printf("变量a的内存地址:%d\n",&a);
printf("变量b的内存地址:%d\n",&b);
printf("变量c的内存地址:%d\n",&c);
}

输出结果如下:

1b8bfbba4576cba250b45670a0632ceb.png

由于内存对齐的原因,实际每个int占用了12个字节的存储空间,内存对齐主要是为了快速访问内存的数据。从输出结果图可以看出,变量a、b、c指向的存储空间连续占用了36个字节的内存。

C语言把变量的内存地址作为一种可处理的数据,称为指针值,以内存地址为值的变量称为指针变量,简称指针(pointer)。使用指针变量可以保存变量等程序对象的地址,通过它们就可以访问和处理变量等有关对象。

例如:a是一个整数类型的变量,a的值为0x20,变量a的内存地址为0xaffe,变量ptr存储变量a的内存地址0xaffe,则称ptr为指针变量,通过ptr可以直接存取变量a的值。

6cd678e6c632c20ae4280552bcf8fc86.png

指针变量ptr名称前面带有“*”符号,表示这是一个指针变量,它存储的是其它变量或程序对象的内存地址。由于指针变量存储了其它变量或程序对象的地址,因此通过指针变量可以访问或修改它们的内容。

和其它变量相同,在声明指针变量时,也需要确定一个数据类型,即存储该数据类型变量的地址。例如前面的指针变量ptr只能存储int数据类型变量的地址,而不能指向其它数据类型的变量。

在C语言中,声明指针变量的语法为:

datatype *pointerName;

其中,datatype是数据类型,pointerName是指针变量的名称。符号“*”不是pointerName的一部分,它只是告诉编译器这是一个指针变量,用于存储datatype类型变量的地址。

例如:

// 声明一个存储整型变量地址的指针变量prt

int *prt;

// 声明一个存储浮点型变量地址的指针变量fprt

float *prt;

// 可以在一行语句中声明多个同类型的指针变量

int *p,*ptr;

声明指针变量后,需要初始化和赋值后才能使用,否则会出现意想不到的错误,因为指针变量可以直接对内存进行操作。当声明指针变量时,若暂时不能确定指针变量存储的内存地址,可以将指针变量设置为null:

int *ptr = NULL;

NULL是C语言的一个宏定义,宏定义类似符号常量的定义,都是使用define关键字来定义。NULL表示一个0指针,既不存储任何内存地址的指针。

8d22bda6344bad4c0c9fc649a44603d7.png

END

*声明:本文于网络整理,版权归原作者所有,如来源信息有误或侵犯权益,请联系我们删除或授权事宜。

93ef19a874f46480fc17beb67aa388da.png

52214168bbd1b89d4b7c7410a975e9d3.gif

戳“阅读原文”我们一起进步

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/337842.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

php做一个网页的源代码,用HTML5做一个个人网站此文仅展示个人主页界面。内附源代码下载地址...

下载说明&#xff1a; 1.再好的作品都不如将来要做的作品。在每一次的设计当中都能有所收获&#xff0c;才是设计师在web开发中最得益的。 2.本站所有作品均是杨青个人设计。如果发现模板有错&#xff0c;请尽情谅解。 3.如果遇到什么问htmlcss编写的个人主页&#xff0c;适合初…

jax-rs jax-ws_JAX-RS 2.x与Spring MVC:返回对象列表的XML表示

jax-rs jax-wsJSON是所有REST * API的王者&#xff0c;但是您仍然可能需要公开多种表示形式&#xff0c;包括XML。 使用JAX-RS和Spring MVC都非常简单。 实际上&#xff0c;唯一要做的就是用JAXB注释对从API调用返回的POJO进行注释。 但是在我看来&#xff0c;序列化对象列表时…

C语言中经典的程序设计结构:顺序、条件、循环

点击上方蓝字关注我&#xff0c;了解更多咨询无论使用何种编程语言&#xff0c;都含有程序设计的三大经典结构。即&#xff1a;顺序结构、条件结构和循环结构&#xff0c;C语言也是如此。综述顺序结构&#xff0c;就是一条大路走到底&#xff0c;没有岔路口&#xff0c;一步步从…

php protected const,关于const:PHP类常量 – 公共,私有还是受保护?

假设常量属性是自动公开的&#xff0c;对吗&#xff1f;有没有办法让它们成为私有的或受保护的&#xff1f;事先谢谢。隐藏它们的原因是什么&#xff1f;即使它们是公开的——它们是只读的。常量应该是公共的&#xff0c;因为它们描述的是关于类的不可变事实&#xff0c;而不是…

7-8垃圾箱分布_您认为有关垃圾收集的7件事-完全错了

7-8垃圾箱分布关于Java Garbage Collection的最大误解是什么&#xff1f;它的真实情况如何&#xff1f; 小时候&#xff0c;我的父母曾经告诉我&#xff0c;如果我学习不好&#xff0c;我将成为垃圾收集者。 他们几乎不知道&#xff0c;垃圾回收实际上是很棒的。 也许这就是为…

c语言中abort函数的使用

点击上方蓝字关注我&#xff0c;了解更多咨询1、abort函数的作用是异常终止一个进程&#xff0c;意味着abort后面的代码将不再执行。2、当调用abort函数时&#xff0c;会导致程序异常终止&#xff0c;而不会进行一些常规的清除工作。实例#include <stdio.h> #include <…

php 异常值检测,PHP中的错误处理、异常处理机制分析

例&#xff1a;$a fopen(test.txt,r);//这里并没有对文件进行判断就打开了&#xff0c;如果文件不存在就会报错?>那么正确的写法应该如下&#xff1a;if(file_exists(test.txt)){$ffopen(test.txt,r);//使用完后关闭fclose($f);}?>一、PHP错误处理的三种方式A、简单的…

c语言中如何防止数组下标越界

点击上方蓝字关注我&#xff0c;了解更多咨询1、若数组长度和下标访问值出现错误&#xff0c;则会导致数组下标越界。数组下标从0开始&#xff0c;访问值为-1。2、在使用循环遍历数组元素时&#xff0c;注意防范off-by-one的错误。对于作为函数参数传入的数组下标&#xff0c;要…

java oauth2.0_教程:如何实现Java OAuth 2.0以使用GitHub和Google登录

java oauth2.0将Google和GitHub OAuth登录添加到Java应用程序的指南 我们添加到Takipi的最新功能之一是3rd party登录。 如果您像我一样懒惰&#xff0c;那么我想您也希望跳过填写表单和输入新密码的操作 。 只要有权限&#xff0c;许多人都希望使用第三方登录&#xff0c;只要…

c语言中数组访问越界如何理解

点击上方蓝字关注我&#xff0c;了解更多咨询1、可以通过数组下标直接访问数组中的元素。2、如果一个数组被定义为n个元素&#xff0c;那么访问n个元素是合法的。如果访问n个元素以外&#xff0c;则是非法的&#xff0c;称为访问越界。实例int a[5] {0}; //等价 int a[5] {0,…

php全部公开课,PHP公开课|这篇PHP的each()函数教学数,只为了帮你的PHP会学的更好...

【摘要】PHP作为一种超文本预处理器&#xff0c;已经成为了我们常用的网站编程语言&#xff0c;并且结合了C语言&#xff0c;Java等我们常见的编程语言&#xff0c;所以&#xff0c;有很多web开发领域的新人都看中了他的使用广泛性&#xff0c;有很多人都想了解php的内容&#…

ogm session_带有Hibernate OGM的NoSQL –第三部分:在WildFly上构建REST应用程序

ogm session欢迎回到我们的教程系列“带有Hibernate OGM的NoSQL”&#xff01; 感谢Gunnar Morling&#xff08; gunnarmorling &#xff09;创建了本教程。 在这一部分中&#xff0c;您将学习如何在WildFly服务器上运行的Java EE应用程序中使用Hibernate OGM。 使用本教程前面…

java的define,关于预处理器:Java中的#define

我开始用Java编程&#xff0c;我想知道是否相当于C EDCOX1(0)的存在。对谷歌的快速搜索表明它没有&#xff0c;但有人能告诉我是否存在类似的东西吗&#xff1f;在Java中&#xff1f;我正在努力使我的代码更可读。例如&#xff0c;我希望能够编写myArray[PROTEINS]&#xff0c;…

c语言中函数是怎么理解?

点击上方蓝字关注我&#xff0c;了解更多咨询1、C语言中的函数是一个可以重复使用的代码&#xff0c;用于独立完成某个功能。2、它可以接收用户传输的参数&#xff0c;也可以不接收&#xff0c;将代码段封装成函数的过程称为函数定义。如果有返回值&#xff0c;使用return语句返…

java g1 收集调优_Java性能调优:充分利用垃圾收集器

java g1 收集调优JVM背后发生了什么&#xff0c;垃圾回收如何影响Java性能&#xff1f; 性能调优世界是一个危险的地方&#xff0c;一个JVM标志失衡&#xff0c;事情很快就会变得繁琐。 因此 &#xff0c;我们决定求助于Java性能调优专家&#xff0c; 单调 JVM探查器mjprof的创…

java的构造函数详解,Java构造函数与普通函数用法详解

函数也被称为方法&#xff01;函数的作用及特点&#xff1a;1、用于定义功能&#xff0c;将功能封装。2、可以提高代码的复用性。函数注意事项&#xff1a;1、不能进行函数套用(不可以在函数内定义函数)。2、函数只有被调用才能被执行。3、基本数据类型(String、int、….)修饰的…

c语言中函数的声明和定义

点击上方蓝字关注我&#xff0c;了解更多咨询1、函数声明&#xff0c;无需实现该函数的功能。函数声明只是一个空壳&#xff0c;不会有特定的函数实现。2、函数定义&#xff0c;必须实现该函数的功能&#xff0c;要实现函数的实现。#include<stdio.h>实例//使用函数前&am…

bean注入属性_摆脱困境:将属性值注入配置Bean

bean注入属性Spring Framework对将从属性文件中找到的属性值注入到bean或Configuration类中提供了很好的支持。 但是&#xff0c;如果将单个属性值注入这些类中&#xff0c;则会遇到一些问题。 这篇博客文章指出了这些问题&#xff0c;并描述了我们如何解决它们。 让我们开始…

php 浏览器 打印控件,JavaScript_JavaScript 实现打印,打印预览,打印设置,WebBrowser是IE内置的浏览器控件 - phpStudy...

JavaScript 实现打印,打印预览,打印设置WebBrowser是IE内置的浏览器控件&#xff0c;无需用户下载.一、WebBrowser控件二、WebBrowder控件的方法 //打印WebBrowser1.ExecWB(6,1);//打印设置WebBrowser1.ExecWB(8,1);//打印预览WebBrowser1.ExecWB(7,1);关于这个组件还有其他的用…

c语言中常规函数和指针函数区别

点击上方蓝字关注我&#xff0c;了解更多咨询1、在函数名前面多了一个*号&#xff0c;而这个函数就是一个指针函数。2、其返回值是一个int类型的指针&#xff0c;是一个地址。实例#include<stdio.h>int* fun1(int* x) //传入指针 {int* tmp x; //指针tmp指向xret…