本章目标:
学会使用指针变量,了解什么是野指针,掌握指针的运算,明白指针传参和数组传参的区别,熟练使用二级指针和指针数组。
本章重点:
1.指针是什么
2.指针和指针类型
3.野指针
4.指针运算
5.指针和数组
6.二级指针
7.指针数组
正文:
指针是地址编号还是指针变量?
1.有的人将地址编号称为指针。指针是内存中一个最小单元的地址编号。
2.指针一般指的是指针变量,用来存放对象的内存地址。
一个内存单元(地址)对应一个字节(1byte)。
每个内存单元都有唯一的内存编号,这个编号又被称为地址编号。
创建对象(常量、变量、数组等)的时候,就会在内存中开辟空间。
指针变量是用来存放对象的地址的。
比如通过取地址 &
(取地址符) 获得对象的内存起始地址,那么就可以将这个地址存放到指针变量中。
代码示例:
#include<stdio.h>
int main()
{
//指针变量
int a = 10;//创建一个整型变量a,在内存中开辟一块合适的空间来存放数据10
int* pa = &a;//取出变量a的地址,将该地址存放到指针变量pa中
return 0;
}
解释说明:
1 指针变量用来存放地址。
1 指针变量,是用来存放地址的变量。
2 存放到指针变量中的值都会被当做是地址来处理(比如一个十六进制数)。
经过计算和权衡,发现一个内存单元给一个字节大小,同时对应一个内存地址是比较合适的。
对于32位机器,有32根地址线,假设每根地址线在寻址的时候产生高低电平(高低电压),也就是1/0 ,那么32根地址线产生的地址就是:( 多少位机器体现的是管理地址的能力 )
00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001
......
11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111111
这里总共有2^32个地址。
每个地址标识一个字节,那么就有(2^32Byte -> 2^32/1024KB -> 2^32/1024/1024MB -> 4GB)4GB 的空间进行编址。同样的,64位机器,如果给64根地址线,那么就能编址 8GB 的空间。
在32位机器上,地址由32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。
在64位机器上,如果有64根地址线,那么一个指针变量的大小是8个字节,才能存放一个地址。
指针变量是用来存放地址的,一个地址唯一标识一个内存单元(一一对应)。
指针变量的大小在32平台是4个字节,在64位平台是8个字节。
多少位机器体现的是管理地址的能力。
变量有不同的类型,比如字符型、整型、浮点型等。指针变量也是变量,指针变量也有自己的类型。
一般来说,什么类型的指针变量就存放什么类型的地址。
代码示例:
#include<stdio.h>
int main()
{
//指针变量的类型
char* pc = NULL;
short* ps = NULL;
int* pi = NULL;
long* pl = NULL;
float* pf = NULL;
double* pd = NULL;
return 0;
}
解释说明:
1 指针定义的方式:Type + *变量名
2 int* pi;
:
*
说明变量 pi
是一个指针变量;
int
表示指针变量 pi
存放的地址是 int
类型的,即指向 int
类型的对象。
或者 int
表示 *pi
通过解引用能够访问的对象的大小是 sizeof(int)
的。
指针的类型决定指针±整数时跳过的步长。
比如:
整形指针+1,跳过4个字节(sizeof(int)
个字节)。
字符指针+1,跳过1个字节(sizeof(char)
个字节)。
代码示例:
#include<stdio.h>
int main()
{
//指针+-整数
int n = 10;
char* pc = (char)&n;
int* pi = &n;
printf("%p\n", &n); //008FFE10
printf("%p\n", pc); //00000010
printf("%p\n", pc + 1); //00000011
printf("%p\n", pi); //008FFE10
printf("%p\n", pi + 1); //008FFE14
return 0;
}
解释说明:
1 pc+1
表示:地址向后偏移1个 char
的大小。
2 pi+1
表示:地址向后偏移1个 int
的大小。
3 type* p;
,p +- n
表示:跳过 n * sizeof(type)
个字节大小。
指针变量的类型决定了指针向前或者向后走一步有多大(距离)。
通过对指针变量解引用,可以访问到指针所指向地址的空间。
代码示例:
#include<stdio.h>
int main()
{
//指针的解引用
int n = 0x11223344;
char* pc = (char*)&n;
int* pi = &n;
//调试,观察内存的变化
*pc = 0;//n:0x11223344 -> 0x11223300
*pi = 0;//n:0x11223344 -> 0x00000000
return 0;
}
解释说明:
1 char
类型的指针变量在解引用时,访问1个字节大小的空间。
2 int
类型的指针变量在解引用时,访问4个字节大小的空间。
3 小端存储机器(以后会介绍)。
指针变量的类型决定了,在对指针变量解引用时能访问多大的内存空间(能操作多大字节的空间)。
比如:char*
指针进行解引用时只能访问一个字节,而 int*
指针进行解引用时能访问4个字节。
本节介绍了什么是指针与指针类型;给出了内存是如何编址的;最后讲解了指针 +/- 整数以及指针解引用的用法和意义。
感谢您的阅读!如有任何错误,欢迎您的批评指正!
文章浏览阅读462次。在android中的很多应用中都需要拍照上传图片,随着手机的像素越来越高,拍摄的图片也越来越大。在拍摄后显示的时候,使用universalimageloader.这个开源项目可以避免内存溢出。但是在上传的时候,一般需要压缩,但是压缩的时候很容易导致内存溢出。解决的办法就是,压缩后的二进制流,不用导出Bitmap,而是直接存储为本地文件,上传的时候直接通过本地文件上传。代码如下:1.图片压缩获..._android压缩图片会造成内存溢出
文章浏览阅读2.9w次,点赞2次,收藏13次。Subnet(子网)在一般的概念中,有两个基本含义:1 这个子网的网段(CIDR)和IP版本;2 这个子网的路由(含默认路由)。事实上,Subnet模型也确实有这两个字段cidr和ip_version,分别表示一个子网的网段和IP版本。另外Subnet模型还有两字段gateway_ip和host_routes,表示一个子网的路由信息。gateway_ip是这个子网的默认网关IP。host_rout..._subnet
文章浏览阅读282次,点赞4次,收藏7次。在HBase中,列族(Column Family)必须在创建表时提前定义,而列(Column)是动态添加的,无需提前定义。一旦表创建完成并列族定义好之后,可以动态地向表中的列族中添加新的列,而无需修改表的结构。2. **列是动态添加的:** 列是在列族内动态添加的,无需提前定义。而列是动态添加的,可以根据需要随时向列族中添加新的列。1. **列族必须提前定义:** 在创建HBase表时,需要指定表的列族,每个列族都需要提前定义。列族的定义是静态的,一旦表创建完成并列族定义好之后,列族的结构就不能再改变了。
文章浏览阅读365次,点赞6次,收藏9次。1.背景介绍人工智能(AI)技术的发展已经进入了关键时期,它正在改变我们的生活、经济和社会结构。然而,随着AI技术的不断发展,也引发了一系列道德、伦理和法律问题。为了确保AI技术的可持续发展和社会接受,我们需要建立一个人工智能伦理框架,以指导AI技术的研发和应用。在过去的几年里,许多学者、企业家、政府机构和非政府组织都开始关注AI伦理问题,并提出了许多关于AI伦理的建议和规范。然而,这些建..._人工智能道德框架
文章浏览阅读1.4w次,点赞15次,收藏105次。Halcon容易造成内存增长或泄露。怎么办?C#1、变量用完之后,Dispose()和置Null。在Halcon18以上版本,Halcon已经提供了Dispose()方法进行释放,那么在低版本中HTuple类型占用的内存怎么释放呢?其实,Halcon中提供一个叫UnPinTuple()的方法,该方法就是官方用来进行释放HTuple的!所以,使用后的变量如不再继续使用的可以用该方法进行清除释放。2、图像尽量不要复制,固定在一个变量进行处理。3、在软件内存占用率高,并且软件闲置的时候,._halcon dispose
文章浏览阅读719次。SQL (Structured Query Language,结构化查询语言),一种专门用来管理关系数据库(RDBMS)的语言。它用于存取、操纵和维护关系数据库中的数据,尤其是保存着各种相关信息的表格。由于其标准化,可移植性强,而且易于学习和应用,所以在各个行业都得到广泛应用。与其他编程语言相比,SQL 的学习难度较低,语法简单,执行效率高。同时,SQL 有完善的函数库支持,能够实现丰富的数据处理功能,如数据检索、过滤、排序、汇总等。
文章浏览阅读33次。java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or represents more than one time zone.
文章浏览阅读5.9k次。试图将图片通过json进行传输,这个时候就想到利用base64编码的方法来图片。主要步骤有1、对图片文件进行编码,转换为base64编码的格式,及一长串字符;2、可将字符通过json进行传送;3、目的方接收json数组,取出编码字符串,并进行解码,显示图片该方法难点主要还是在于对图片的编解码处理,以下是用PHP实现的编解码处理代码<?php $image_f_平台接收base64图片编码</div>
文章浏览阅读2.7k次。朴素贝叶斯分类所有贝叶斯分类都是基于贝叶斯定理,朴素贝叶斯分类是贝叶斯分类中运用广泛简单的一种,另外,它还基于特征条件独立假设。贝叶斯定理贝叶斯定理是计算条件概率的公式,条件概率即是事件B发生的前提下事件A发生的概率,记作$P(A|B)$,叫做事件B发生的情况下A的条件概率。公式为:$P(B|A) = \frac{P(A|B)P(B)}{P(A)}$公式大致推导: 如图,有$P(A|B) = \f_看动画,成为机器学习工程师,朴素贝叶斯分类,
文章浏览阅读598次。在RHEL7的vnc中调出Oracle的OUI_rhel7使用vnc安装oracle,窗口显示
文章浏览阅读2.9k次,点赞3次,收藏7次。本文简介:介绍以下Idea中常用的快捷键_idea缩进快捷键
文章浏览阅读7.4k次。微信设置水滴昵称,个性中带点萌区别:(1)Linux速度比较快,安全性比windows好 (2)有很多软件只能在windows里运行 ,与Linux兼容的软件正在开发中. (3)Linux适用在网络方面. (4)Linux的操作比较复杂,windows的比较简单. Linux和Windows的区别 和Linux 一样,Windows系列是完全的多任务操作系统。它们支持同样的用户接口 、网络和安全性。但是,Linux和Windows的真正区别在于,Linux 事实上是Unix 的一种版本,而且来_linux系统有什么