【C语言初阶】指针-程序员宅基地

技术标签: 学习  C语言初阶学习  c语言  开发语言  

【C语言初阶】指针

本章目标

学会使用指针变量,了解什么是野指针,掌握指针的运算,明白指针传参和数组传参的区别,熟练使用二级指针和指针数组。

本章重点

1.指针是什么

2.指针和指针类型

3.野指针

4.指针运算

5.指针和数组

6.二级指针

7.指针数组



正文


一、指针是什么?

1 指针是什么?

指针是地址编号还是指针变量?

1.有的人将地址编号称为指针。指针是内存中一个最小单元的地址编号。

2.指针一般指的是指针变量,用来存放对象的内存地址


2 内存

一个内存单元(地址)对应一个字节(1byte)

每个内存单元都有唯一的内存编号,这个编号又被称为地址编号

创建对象(常量、变量、数组等)的时候,就会在内存中开辟空间

内存单元

2 指针变量

指针变量是用来存放对象的地址的

比如通过取地址 & (取地址符) 获得对象的内存起始地址,那么就可以将这个地址存放到指针变量中。

2.1 示例

代码示例

#include<stdio.h>

int main()
{
    
	//指针变量

	int a = 10;//创建一个整型变量a,在内存中开辟一块合适的空间来存放数据10
	int* pa = &a;//取出变量a的地址,将该地址存放到指针变量pa中

	return 0;
}

解释说明

1 指针变量用来存放地址


2.2 总结

1 指针变量,是用来存放地址的变量。

2 存放到指针变量中的值都会被当做是地址来处理(比如一个十六进制数)。


3 如何编址?

经过计算和权衡,发现一个内存单元给一个字节大小,同时对应一个内存地址是比较合适的。

3.1 编址

对于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个字节,才能存放一个地址。


3.1 总结

  • 指针变量是用来存放地址的一个地址唯一标识一个内存单元(一一对应)。

  • 指针变量的大小在32平台是4个字节在64位平台是8个字节

  • 多少位机器体现的是管理地址的能力


二、指针和指针类型

变量有不同的类型,比如字符型、整型、浮点型等。指针变量也是变量,指针变量也有自己的类型

1 指针的类型

一般来说,什么类型的指针变量就存放什么类型的地址

1.1 示例

代码示例

#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)


2 指针 + - 整数

指针的类型决定指针±整数时跳过的步长

比如:

  • 整形指针+1,跳过4个字节sizeof(int) 个字节)。

  • 字符指针+1,跳过1个字节sizeof(char) 个字节)。

2.1 示例

代码示例

#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) 个字节大小


2.2 总结

指针变量的类型决定了指针向前或者向后走一步有多大(距离)。


3 指针的解引用

通过对指针变量解引用,可以访问到指针所指向地址的空间

3.1 示例

代码示例

#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 小端存储机器(以后会介绍)。


3.2 总结

指针变量的类型决定了,在对指针变量解引用时能访问多大的内存空间能操作多大字节的空间)。

比如:char* 指针进行解引用时只能访问一个字节,而 int* 指针进行解引用时能访问4个字节


总结:

  本节介绍了什么是指针与指针类型;给出了内存是如何编址的;最后讲解了指针 +/- 整数以及指针解引用的用法和意义。


感谢您的阅读!如有任何错误,欢迎您的批评指正!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43108974/article/details/137422436

智能推荐

android 图片压缩避免内存溢出的解决办法-程序员宅基地

文章浏览阅读462次。在android中的很多应用中都需要拍照上传图片,随着手机的像素越来越高,拍摄的图片也越来越大。在拍摄后显示的时候,使用universalimageloader.这个开源项目可以避免内存溢出。但是在上传的时候,一般需要压缩,但是压缩的时候很容易导致内存溢出。解决的办法就是,压缩后的二进制流,不用导出Bitmap,而是直接存储为本地文件,上传的时候直接通过本地文件上传。代码如下:1.图片压缩获..._android压缩图片会造成内存溢出

Subnet简介-程序员宅基地

文章浏览阅读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

HBase的列族必须提前定义-程序员宅基地

文章浏览阅读282次,点赞4次,收藏7次。在HBase中,列族(Column Family)必须在创建表时提前定义,而列(Column)是动态添加的,无需提前定义。一旦表创建完成并列族定义好之后,可以动态地向表中的列族中添加新的列,而无需修改表的结构。2. **列是动态添加的:** 列是在列族内动态添加的,无需提前定义。而列是动态添加的,可以根据需要随时向列族中添加新的列。1. **列族必须提前定义:** 在创建HBase表时,需要指定表的列族,每个列族都需要提前定义。列族的定义是静态的,一旦表创建完成并列族定义好之后,列族的结构就不能再改变了。

人工智能伦理框架:如何建立AI技术的道德规范-程序员宅基地

文章浏览阅读365次,点赞6次,收藏9次。1.背景介绍人工智能(AI)技术的发展已经进入了关键时期,它正在改变我们的生活、经济和社会结构。然而,随着AI技术的不断发展,也引发了一系列道德、伦理和法律问题。为了确保AI技术的可持续发展和社会接受,我们需要建立一个人工智能伦理框架,以指导AI技术的研发和应用。在过去的几年里,许多学者、企业家、政府机构和非政府组织都开始关注AI伦理问题,并提出了许多关于AI伦理的建议和规范。然而,这些建..._人工智能道德框架

我个人总结的Halcon内存管理心得笔记,关于C#/C++内存释放_halcon dispose-程序员宅基地

文章浏览阅读1.4w次,点赞15次,收藏105次。Halcon容易造成内存增长或泄露。怎么办?C#1、变量用完之后,Dispose()和置Null。在Halcon18以上版本,Halcon已经提供了Dispose()方法进行释放,那么在低版本中HTuple类型占用的内存怎么释放呢?其实,Halcon中提供一个叫UnPinTuple()的方法,该方法就是官方用来进行释放HTuple的!所以,使用后的变量如不再继续使用的可以用该方法进行清除释放。2、图像尽量不要复制,固定在一个变量进行处理。3、在软件内存占用率高,并且软件闲置的时候,._halcon dispose

SQL 语言及查询优化技巧-程序员宅基地

文章浏览阅读719次。SQL (Structured Query Language,结构化查询语言),一种专门用来管理关系数据库(RDBMS)的语言。它用于存取、操纵和维护关系数据库中的数据,尤其是保存着各种相关信息的表格。由于其标准化,可移植性强,而且易于学习和应用,所以在各个行业都得到广泛应用。与其他编程语言相比,SQL 的学习难度较低,语法简单,执行效率高。同时,SQL 有完善的函数库支持,能够实现丰富的数据处理功能,如数据检索、过滤、排序、汇总等。

随便推点

The server time zone value ‘�й���׼ʱ��‘ is unrecognized or represents more than one time zone.-程序员宅基地

文章浏览阅读33次。java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone.

利用base64对图片进行编码及解码_平台接收base64图片编码-程序员宅基地

文章浏览阅读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_看动画,成为机器学习工程师,朴素贝叶斯分类,

在RHEL7的vnc中调出Oracle的OUI_rhel7使用vnc安装oracle,窗口显示-程序员宅基地

文章浏览阅读598次。在RHEL7的vnc中调出Oracle的OUI_rhel7使用vnc安装oracle,窗口显示

【快捷键】idea中的快捷键(更新中)_idea缩进快捷键-程序员宅基地

文章浏览阅读2.9k次,点赞3次,收藏7次。本文简介:介绍以下Idea中常用的快捷键_idea缩进快捷键

linux操作系统有哪些_linux系统有什么-程序员宅基地

文章浏览阅读7.4k次。微信设置水滴昵称,个性中带点萌区别:(1)Linux速度比较快,安全性比windows好 (2)有很多软件只能在windows里运行 ,与Linux兼容的软件正在开发中. (3)Linux适用在网络方面. (4)Linux的操作比较复杂,windows的比较简单. Linux和Windows的区别 和Linux 一样,Windows系列是完全的多任务操作系统。它们支持同样的用户接口 、网络和安全性。但是,Linux和Windows的真正区别在于,Linux 事实上是Unix 的一种版本,而且来_linux系统有什么

推荐文章

热门文章

相关标签