【C语言】-浅谈指针

🎇作者:小树苗渴望变成参天大树
🎊 作者宣言:认真写好每一篇博客
🎄作者gitee:gitee
在这里插入图片描述


🎉前言

今天作者又来更新好文了,我们今天来讲指针方面的知识,指针可以说对于我们编程是特别重要的一个部分,因为他涉及到内存跟地址有关系,那指针到底是什么呢?我们接下来从以下几个方面给大家细细的讲解(没有特别说明的情况下,都是在32位平台下讲解的):
指针:

  1. 指针是什么
  2. 指针和指针类型
  3. 野指针
  4. 指针运算
  5. 指针和数组
  6. 二级指针
  7. 指针数组

🧨一、指针是什么

我们电脑有硬盘,有内存,通常硬盘就是你的存储空间,内存任务在运行的时候所占的空间,一般电脑,500GB硬盘大小,8/16GB内存大,我们可以打开我们的任务管理器:

在这里插入图片描述

那我们到底是怎么使用内存空间的呢?

内存的最小单位就是一个字节,那内存一共有多少个字节组成呢?这时候就需要引用地址的概念。

地址是什么呢?
对于32位的机器,假设有32根地址线,那么假设每根地址线在寻址的时候产生高电平(高电压)和低电平(低电压)就是(1或者0);
那么32根地址线产生的地址就会是:

00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000001

11111111 11111111 11111111 11111111

这里就有2的32次方个地址。每个地址是四个字节。

这时候我们有了2的32次方地址了,我们把这个地址所对应的数值,当成一个字节单位编号,这个时候我们内存就有2的32次方个字节。

每个地址标识一个字节,那我们就可以给 (2^32Byte = = 2^32/1024KB = =232/1024/1024MB==232/1024/1024/1024GB == 4GB)4G的空闲进行编址。

同样的方法,那64位机器,如果给64根地址线,那能编址多大空间,自己计算。

我们内存就可以这样表示

在这里插入图片描述
1.所以指针是什么呢?

  1. 指针是内存中一个最小单元的编号,也就是地址
  2. 平时口语中说的指针,通常指的是指针变量,是用来存放内存地址的变量
    在这里插入图片描述

2.我们怎么使用指针呢?

我们可以通过&(取地址操作符)取出变量在内存起始地址,把地址可以存放到一个变量中,这个变量就是指针变量

#include <stdio.h>
int main()
{
   
 int a = 10;//在内存中开辟一块空间
//在内存的存储应该是原码的形式
//00000000 00000000 00000000 00001010
 int *p = &a;//这里我们对变量a,取出它的地址,可以使用&操作符。
    //a变量占用4个字节的空间,这里是将a的4个字节的第一个字节的地址存放在p变量
中,p就是一个之指针变量。
 return 0;
}

在这里插入图片描述

我们通过图理解了一遍,也发现地址的编号是连续的。我们在深入内存中来看看:
在这里插入图片描述
p里面放的是a的地址起始地址(0x004FF760),我们看到下一个内存的地址是(0x004FF764),编号相差4,就相差4个字节,这个我相信大家很容易搞混,作者自己也是理解了很长时间。

int*p=&a;,p是指针变量存放地址的,*是告诉我们p是指针变量,不是普通变量,int是指针所指向的类型,这个下一节会详细介绍

指针变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)。

1.这里我们就明白:
在32位的机器上,地址是32个0或者1组成二进制序列,那地址就得用4个字节的空间来存储,所以一个指针变量的大小就应该是4个字节。

那如果在64位机器上,如果有64个地址线,那一个指针变量的大小是8个字节,才能存放一个地址。

2.总结:
指针是用来存放地址的,地址是唯一标识一块地址空间的。指针的大小在32位平台是4个字节,在64位平台是8个字节

💖二、指针和指针类型

这里我们在讨论一下:指针的类型
我们都知道,变量有不同的类型,整形,浮点型等。那指针有没有类型呢?
准确来说是有的
对于普通变量来说,int是四个字节,char是一个字节等等,那么对于指针,我们在32位平台下,指针都是代表地址,都是四个字节,那么intp,charp不都是四个字节啊,那为什么指针还需要类型呢?

那指针类型的意义是什么呢?

2.1 指针的解引用

我们来看一个代码

int a=0x11223344;
int b=0x11223344;
int *p1=&a;
char*p2=&b;
*p1=0;//解引用得到地址里面的内容
*p2=0;

在这里插入图片描述

我们通过这个例子可以说明,指针类型决定了指针进行解引用操作的时候一次访问几个字节(访问权限受到类型的控制)
比如: char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节。

2.2 指针±整数

我们再来看一个代码:

int a=0x11223344;
int b=0x11223344;
int *p1=&a;
char*p2=&b;
printf("%p\n",p1+1);
printf("%p\n",p2+1);

在这里插入图片描述

我们看到结果了,说明指针的类型决定了指针向前或者向后走一步有多大(距离)

通过上面两个特点,我们是不是就可以对内存中任意数进行修改,只要找到地址,进行解引用操作即可,

来看代码

int a=0x11223344
char*p1=(char*)&</
在IT领域,尤其是地理信息系统(GIS)中,坐标转换是一项关键技术。本文将深入探讨百度坐标系、火星坐标系和WGS84坐标系之间的相互转换,并介绍如何使用相关工具进行批量转换。 首先,我们需要了解这三种坐标系的基本概念。WGS84坐标系,即“World Geodetic System 1984”,是一种全球通用的地球坐标系统,广泛应用于GPS定位和地图服务。它以地球椭球模型为基础,以地球质心为原点,是国际航空和航海的主要参考坐标系。百度坐标系(BD-09)是百度地图使用的坐标系。为了保护隐私和安全,百度对WGS84坐标进行了偏移处理,导致其与WGS84坐标存在差异。火星坐标系(GCJ-02)是中国国家测绘局采用的坐标系,同样对WGS84坐标进行了加密处理,以防止未经授权的精确位置获取。 坐标转换的目的是确保不同坐标系下的地理位置数据能够准确对应。在GIS应用中,通常通过特定的算法实现转换,如双线性内插法或四参数转换法。一些“坐标转换小工具”可以批量转换百度坐标、火星坐标与WGS84坐标。这些工具可能包含样本文件(如org_xy_格式参考.csv),用于提供原始坐标数据,其中包含需要转换的经纬度信息。此外,工具通常会附带使用指南(如重要说明用前必读.txt和readme.txt),说明输入数据格式、转换步骤及可能的精度问题等。x86和x64目录则可能包含适用于32位和64位操作系统的软件或库文件。 在使用这些工具时,用户需要注意以下几点:确保输入的坐标数据准确无误,包括经纬度顺序和浮点数精度;按照工具要求正确组织数据,遵循读写规则;注意转换精度,不同的转换方法可能会产生微小误差;在批量转换时,检查每个坐标是否成功转换,避免个别错误数据影响整体结果。 坐标转换是GIS领域的基础操作,对于地图服务、导航系统和地理数据分析等至关重要。理解不同坐标系的特点和转换方法,有助于我们更好地处
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

橘柚!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值