深⼊理解指针(1)

⽬录:
1. 内存和地址
2. 指针变量和地址
3. 指针变量类型的意义
4. 指针运算


   内存和地址

指针定义的引入

          假如你的一个去旅游,然后进入酒店夜宿,而这时候你要去找他,如果你的朋友没有告诉他的房间,这时候你就要一个一个房间找,这就显得很麻烦。此时假如你的朋友告诉他的房间,这时候你就可以快速找到他所在房间,这样是不是节省了很多时间。此时我们可以把指针理解为酒店的房间号。

在C语言中地址又被称作指针

指针==内存单元编号==地址

    指针变量和地址

1  得到一个变量的地址有几个方法呢?

       第一种:取地址操作符(&)

      第二种:指针

取地址操作符(&)

2    指针变量


2.1指针变量

         定义:那我们通过取地址操作符(&)拿到的地址是⼀个数值,⽐如: 0x006F356,这个数值有时候也是需要存储起来,⽅便后期再使⽤的,那我们把这样的地址值存放在哪⾥呢?答案是:指针变量中。指针变量也是⼀种变量,这种变量就是⽤来存放地址的,存放在指针变量中的值都会理解为地址。

     此时我们发现pa和&a打印出来的值都是地址,说明存放在指针变量中的值都会理解为地址。

2.2指针类型

char* pa;//字符型指针

int* pa;//整型指针

float* pc;//浮点型指针

2.3如何拆解指针类型(指向与被指向关系)

int a = 10 ;
int * pa = &a;

        这⾥pa左边写的是 int* * 是在说明pa是指针变量,⽽前⾯的 int 是在说明pa指向的是整型(int) 类型的对象。

指向与被指向关

int a = 10;

int* pa = &a;2.4
                                 

2.4    解引⽤操作符

       上面我们说到存放在指针变量中的值都会理解为地址。那我们将地址保存起来,未来是要使⽤的,那怎么使⽤呢?这时候就要引入解引⽤操作符。

      作用:在现实⽣活中,我们使⽤地址要找到⼀个房间,在房间⾥可以拿去或者存放物品。C语⾔中其实也是⼀样的,我们只要拿到了地址(指针),就可以通过地址(指针)找到地址(指针)指向的对象,而解引⽤操作符(*)就有这作用。

1  # include <stdio.h>
2       int main ()
3  {
4         int a = 100
5        int * pa = &a;
   6           *pa = 0 ;
  7  return 0 ;
}
      上⾯代码中第5⾏就使⽤了解引⽤操作符, *pa 的意思就是通过pa中存放的地址,找到指向的空间, *pa其实就是a变量了;所以*pa = 0 ,这个操作符是把a改成了0 (因为pa是一个指针变量其是一个地址又因为使用了 解引⽤操作符解引用故名思义解掉操作符作用得到其地址对应的变量)
          有同学肯定在想,这⾥如果⽬的就是把a改成0的话,写成 a = 0; 不就完了,为啥⾮要使⽤指针呢?其实这⾥是把a的修改交给了pa来操作,这样对a的修改,就多了⼀种的途径,写代码就会更加灵活.

2.5   指针变量的⼤⼩

         指针变量的⼤⼩是不是确定的呢?答案是确定的,机器有32位机器和64位机器,32位机器有32根地址线那我们把32根地址线产⽣的2进制序列当做⼀个地址,那么⼀个地址就是32个bit位,需要4 个字节才能存储。64位机器有64根地址线假设有64根地址线,⼀个地址就是64个⼆进制位组成的⼆进制序列,存储起来就需要 8个字节的空间,指针变量的⼤⼩就是8个字节。

  X64环境输出结果

 X86环境输出结果

结论:(指针变量的⼤⼩和类型⽆关,只要是指针变量,在同⼀个平台下,⼤⼩都是⼀样的)

32位平台下地址是32个bit位,指针变量⼤⼩是4个字节
64位平台下地址是64个bit位,指针变量⼤⼩是8个字节
注意指针变量的⼤⼩和类型是⽆关的,只要指针类型的变量,在相同的平台(环境)下,⼤⼩都是相同的。

三    指针变量类型的意义

3.1指针的解引⽤

// 代码 1
# include <stdio.h>
int main ()
{
int n = 0x11223344 ;
int *pi = &n;
*pi = 0 ;
return 0 ;
}
// 代码 2
# include <stdio.h>
int main ()
{
int n = 0x11223344 ;
char *pc = ( char *)&n;
*pc = 0 ;
return 0 ;
}

       结果:调试我们可以看到,代码1会将n的4个字节全部改为0,但是代码2只是将n的第⼀个字节 改为0。

        结论指针的类型决定了,对指针解引⽤的时候有多⼤的权限(⼀次能操作⼏个字节)
⽐如: char* 的指针解引⽤就只能访问⼀个字节,⽽ int* 的指针的解引⽤就能访问四个字节。
3.2指针+-整数

      我们可以看出, char* 类型的指针变量+1跳过1个字节, int* 类型的指针变量+1跳过了4个字节 这就是指针变量的类型差异带来的变化。指针+1,其实跳过1个指针指向的元素。指针可以+1,那也可以-1。
结论:指针的类型决定了指针向前或者向后⾛⼀步有多⼤(距离)。
3.3void* 指针
  定义:在指针类型中有⼀种特殊的类型是 void * 类型的,可以理解为⽆具体类型的指针(或者叫泛型指针)。
优点:这种类型的指针可以⽤来接受任意类型地址
缺点void* 类型的指针不能直接进⾏指针的+-整数和解引⽤的运算。

 

# include <stdio.h>
int main ()
{
     int a = 10 ;
    void * pa = &a;
    void * pc = &a;
    *pa = 10 ;
   *pc = 0 ;
return 0 ;
}

 这⾥我们可以看到, void* 类型的指针可以接收不同类型的地址,但是⽆法直接进⾏指针运算。

四      指针运算

1 分类:指针的基本运算有三种,分别是:

指针+- 整数
指针-指针
指针的关系运算

2指针+- 整数  (指针访问数组)

        这里把数组首元素的地址放到指针变量p中,再通过解引用得到首元素,然后提供for循环改变p并且解引用。我们这里在给p地址时未用&这是因为在数组中等价与数组首元素地址。

3指针-指针

 

 这里我们可以发现两个指针相减得到8

结论  两个指针一定是指向同一块区域(不能一个是int类型一个是char类型)

       指针-指针得到的值的绝对值就是两个指针之间的元素个数。

4指针的关系运算(可用于判断是否越界例如与数组的最后一个元素做比较)

// 指针的关系运算
  # include <stdio.h>
 
   int main ()
  {
      int arr[ 10 ] = { 1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 , 9 , 10 };
      int *p = &arr[ 0 ];
      int sz = sizeof (arr)/ sizeof (arr[ 0 ]);
   while (p < arr + sz) // 指针的⼤⼩⽐较
  {
     printf ( "%d " , *p);
p++;
  }
return 0 ;
}

 本篇文章就到此结束,希望有所能帮到 读者更好的了解指针,后续还会继续更新指针相关知识。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

qt QTableWidgetItem详解

1、概述 QTableWidgetItem 是 Qt 框架中的一个类&#xff0c;专门用于在 QTableWidget&#xff08;一个基于项的表格视图&#xff09;中表示单个单元格的内容。QTableWidget 继承自 QAbstractItemView&#xff0c;而 QTableWidgetItem 则作为表格中的一个单元格项&#xff0c;…

CUDA下载和安装

CUDA下载和安装 前言下载安装后续添加参考链接 前言 由于我需要运行的代码与我当前的CUDA版本不兼容,所以我现在需要进行CUDA的更新,下载一个低版本的CUDA以匹配我的Pytorch 下载 CUDA下载地址:CUDA下载链接 选择适合自己的版本 由于我是要运行一个开源项目,我选择对应的CU…

手把手教你Windows系统服务提权(含提权实验+环境配置教程),网络安全零基础入门到精通教程建议收藏!

文章目录 服务配置权限脆弱环境准备提权实验服务注册表权限脆弱环境准备提权实验 服务路径权限脆弱环境准备提权实验 未引用的服务路径环境准备提权实验 针对不安全服务提权的防御措施 &#x1f449;1.成长路线图&学习规划&#x1f448;&#x1f449;2.网安入门到进阶视频教…

宠物空气净化器测评!希喂/米家/有哈宠物空气净化器谁性价比高

宠物空气净化器测评&#xff01;如何清理猫毛应该是每个养猫人都在面对的难题。那些细小的浮毛真的不能不管&#xff0c;它们飘落在家里的每一个角落&#xff0c;不仅极难清理&#xff0c;还弄得我鼻子发痒、频繁咳嗽。为了解决这些浮毛&#xff0c;我家一直在用宠物空气净化器…

python3的基本数据类型:List(列表)的连接与转换

一. 简介 前面学习了 python中列表的创建&#xff0c;截取等一些操作。文章如下&#xff1a; python3的基本数据类型&#xff1a;List&#xff08;列表&#xff09;创建与索引-CSDN博客 python3的基本数据类型&#xff1a;List&#xff08;列表&#xff09;的截取-CSDN博客…

vue文件上传-所有文件选项去掉

效果&#xff1a; 缘由&#xff1a; <template><div class"upload-container"><div class"upload-box" click"triggerFileInput" dragover.prevent drop"handleDrop"><p>点击或拖放文件到这里上传</p>&…

JS | 如何规范 JavaScript 的注释

目录 一、使用单行注释 二、多行注释的使用 三、使用JSDoc风格的注释 四、采用一致的注释习惯 规范JavaScript的注释方法包括使用单行注释、多行注释、使用JSDoc风格的注释以及采用一致的注释习惯。其中&#xff0c;使用JSDoc风格的注释是为了提高代码的可读性和维护性&…

数据分析-43-某社交app用户行为示例数据

关注公众号&#xff1a;『AI学习星球』 算法学习、4对1辅导、论文辅导或核心期刊可以通过公众号滴滴我 文章目录 背景描述数据说明分析数据相关系数查看各功能属性的分布各功能路径流量排名 TOP10留存率排名 TOP10 背景描述 本数据集是某社交APP一定时间内用户留存的分类示例数…

Linux中emqx集中报错解决方案

在centos8上面部署emqx5.5,过程中有许多问题。 第一种文件配置 node {name "emqx-nameIP" #名称此处IP仅用于标识cookie "GR7aqjZzt0IfcEEw" #此处数据自己设置data_dir "…

socket 编程

Linux C语言 server 端&#xff08;TCP&#xff09;&#xff1a; // socketServer.c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> // 提供 close、read 和 write &#xff08;这里通过 send 间接使用&#x…

国内常见DNS

国内常见DNS 1.阿里DNS 223.5.5.5 223.6.6.62.百度DNS 180.76.76.763.114DNS 114.114.114.114 114.114.115.1154.字节DNS 180.184.1.1 180.184.2.25.GoogleDNS 8.8.8.8个人综合排名是 阿里&#xff08;223.5.5.5&#xff09;>腾讯&#xff08;1.12.12.12&#xff09; ≈…

3D医学影像开发入门<四>:VS2019 + Qt5.15.2 + MITK-v2021.10编译及环境配置

1、MITK介绍 1.1 MITK概述 MITK 是一个开源框架&#xff0c;最初是作为德国癌症研究中心医学和生物信息学部 &#xff08;MBI&#xff09; 博士生的通用框架开发的。MITK 旨在支持开发具有高度交互性的领先医学成像软件。 MITK 几乎重复使用了 VTK 和 ITK 中的任何内容。因此&…

项目模块1~12总结:服务器大模块梳理

一、思维导图 二、设计思路 1、各种回调函数梳理 服务器里面包含了监听套接字和监听到的通信套接字&#xff08;新连接&#xff09;&#xff0c;我们要对这两种套接字进行设置回调函数&#xff0c;其中监听套接字里面只要设置读回调&#xff0c;通信套接字要设置5种回调&…

023集——CAD 窗体交互、多段线进行翻转、错误提示(CAD—C#二次开发入门)

效果如下&#xff1a; 窗体模块&#xff1a; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms;…

照明灯具哪个品牌好?2024照明灯十大知名品牌大公开

在现代生活中&#xff0c;护眼台灯已经成为许多加班族的必备神器。但是&#xff0c;市场上的护眼台灯种类繁多&#xff0c;价格也各有不同&#xff0c;我们也不能每一个都买回家进行测试&#xff0c;看看照明灯具哪个品牌好&#xff1f;别担心&#xff0c;我帮你们找了&#xf…

FileLink跨网数据摆渡系统:打破网络隔阂,轻松实现跨网络数据传输

在数字化时代&#xff0c;跨网络、跨区域的数据传输成为了企业和个人信息流通的重大挑战。而如今&#xff0c;FileLink跨网数据摆渡系统的问世&#xff0c;彻底解决了这一难题&#xff0c;帮助用户实现快速、安全、无缝的跨网络数据传输。 1. 跨网络数据传输的痛点 随着企业信…

C语言 — 指针的进阶

文章目录 前言一、字符指针二、指针数组三、数组指针数组名 与 &数组名 四、指针传参二维数组传参 五、函数指针结语 前言 通过前面的关于指针的学习&#xff0c;我们了解了指针的一些个特性。本篇文章我们将深入指针&#xff0c;挖掘指针更深处的知识。 在开始之前&#…

【机器学习导引】ch4-决策树

基本流程 两个需要解决的问题 属性顺序&#xff1a; 问题&#xff1a;哪些属性在前面&#xff0c;哪些属性在后面&#xff1f;这个问题指的是在处理数据或进行排序时&#xff0c;需要确定属性的排列顺序&#xff0c;以便更好地进行数据处理或分析。 属性选择&#xff1a; 问题…

[ DOS 命令基础 4 ] DOS 命令命令详解-端口进程相关命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

博客系统(SpringBoot项目)

文章目录 一、项目开发的流程二、项目开发2.1 准备工作2.2 开发公共模块&#xff1a;把能写的先写了什么是公共模块model层mapper层定义统一返回结果统一异常处理 2.2 博客列表页2.3 更改显示的时间2.4 博客详情页2.5 登录Session式登录方法分析使用Token来实现登录 2.6 强制登…