【C语言】指针初阶

在这里插入图片描述

正文开始之前,我们要记住一个东西就是:地址=指针

目录

  • 一、指针的解释
  • 二、指针变量和地址
    • 1、取地址操作符
    • 2、指针变量和解引用操作
      • 1、指针变量
      • 2、拆解指针类型
      • 3、解引用操作符
      • 4、注意事项
    • 3、指针变量的大小
    • 4、指针的解引用
    • 5、void*指针
  • 三、指针的运算
    • 1、指针±整数
    • 2、指针 - 指针
    • 3、指针的关系运算
  • 四、野指针
    • 1、野指针形成的原因
    • 2、指针越界访问
    • 3、指针指向的空间释放
  • 五、const 修饰指针
    • 1、const修饰变量
    • 2、const修饰指针变量

一、指针的解释

通俗来讲就是某一数据的位置。因为数据的存储是需要空间的,这个空间会有一个地址,指针就是用来存放这个地址的,以便于后续快速的访问

二、指针变量和地址

1、取地址操作符

在C语⾔中创建变量就是向内存申请空间

#include <stdio.h>
int main()
{int a = 10;return 0;
}

在这里插入图片描述
我们在内存里可以看到在创建变量a的时候申请了一块空间
我们取地址a之后将地址四行显示,发现a存储在了这个地址里,0a就是十六进制下的10
这里我们介绍一下我们的老朋友,&操作符。在以前的学习中,我们在学习scanf函数的时候接触过这个操作符,这个操作符就叫做取地址操作符。
在这里插入图片描述
&a取出的是a所占的四个字节中地址最小的字节的地址,通过计算机的一套算法,它懂得这个数据是整形,会取出剩下的三个地址

(这时候我们对scanf函数的理解也会深一个层次

scanf("%d",&a);

这里的&a就是取出a的地址,将里边的值进行修改)

2、指针变量和解引用操作

1、指针变量

那我们通过取地址操作符(&)拿到的地址是⼀个数值,这个数值有时候需要存储起来,⽅便后期再使⽤,我们会把这样的地址值存放在指针变量中。

#include <stido.h>
int main()
{int a = 10;int *pa = &a;//这样就把取出的a的地址存放到指针pa中了return 0;
}

指针变量也是变量,专门用来存放地址,存放在其中的值都会被认为是地址

2、拆解指针类型

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

*说明pa是指针变量,int 说明pa这个指针变量指向的是一个int类型也就是整型类型的对象
当然如果是short类型的对象那么就

short i = 10;
short *pi = &i;

char类型那么就

char j = 10;
char * pj = &j;

3、解引用操作符

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

这样就把a的值更改为20了

4、注意事项

int*pa
int *pa
int* pa
int * pa

这几个是一样的,表达上没有任何的区别

3、指针变量的大小

#include <stdio.h>
int main()
{printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;
}

指针变量的大小取决于地址的大小,指针变量的大小和类型是⽆关,只要指针类型的变量在相同的平台下,大小都是相同的

4、指针的解引用

#include <stdio.h>
int main()
{int n = 0x12345678;int *pi = &n; *pi = 0; printf("%d",n):return 0;
}
#include <stdio.h>
int main()
{int n = 0x12345678;char *pi =(char*) &n; //强制转化,不然是不可以用char类型的指针来接受int类型的变量的*pi = 0; printf("%d",n);return 0;
}

第一个运行结果
在这里插入图片描述
第二个的运行结果
在这里插入图片描述
在这里插入图片描述
这说明char类型和int类型的访问权限不同,char类型可以访问一个字节,也就是十六进制下的两位数,int类型可以访问四个字节,也就是十六进制下的八位数

5、void*指针

⽆具体类型的指针,也叫泛型指针,可以接受任何类型的地址
但它不能够进行解引用操作,以及指针±整数的运算(下面来说)

三、指针的运算

1、指针±整数

#include <stdio.h>
int main()
{int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };int* p = &arr[0];int i = 0;int sz = sizeof(arr) / sizeof(arr[0]);for (i = 0; i < sz; i++){printf("%d ", *(p + i));//p+i 这⾥就是指针+整数}return 0;
}

这里的指针经过加减后是通过单位进行访问的,也就是如果是int类型,那么指针就加了四个字节,char加一个字节,short加两个字节。

2、指针 - 指针

#include <stdio.h>
int my_strlen(char* s)
{char* p = s;while (*p != '\0')// \0 之前的元素为字符串中的元素p++;return p - s;
}
int main()
{printf("%d\n", my_strlen("abc"));return 0;
}

这样就可以算出字符串中的元素个数

3、指针的关系运算

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

四、野指针

1、野指针形成的原因

#include <stdio.h>
int main()
{int* p;//局部变量指针未初始化,默认为随机值*p = 20;return 0;
}

2、指针越界访问

#include <stdio.h>
int main()
{int arr[10] = { 0 };int* p = &arr[0];int i = 0;for (i = 0; i <= 11; i++){//当指针指向的范围超出数组arr的范围时,p就是野指针*(p++) = i;}return 0;
}

3、指针指向的空间释放

#include <stdio.h>
int* test()
{int n = 100;return &n;
}
int main()
{int* p = test();printf("%d\n", *p);return 0;
}

这些原因其实都很常见,也很有规矩,看一下就能看出来是理所应当的,没啥需要解释的
想办法规避它们就行了

五、const 修饰指针

1、const修饰变量

#include <stdio.h>
int main()
{int m = 0;m = 20;//m是可以修改的const int n = 0;n = 20;//n是不能被修改的return 0;
}

被const修饰的变量是不能修改的

2、const修饰指针变量

int * p;//没有const修饰
const int * p;//const 放在*的左边做修饰
int const * p;//const 放在*的左边做修饰
int * const p;//const 放在*的右边做修饰

第二行和第三行实际是一样的。
我的理解是看const修饰的量,被其修饰的量是不能改变的,我们先来看第二行和第三行代码,*p不能改变,*p是变量值,也就是指针指向的那个变量的内容,它是不能够改变的,但p也就是地址,指针本身,是可以改变的。
第四行代码,const修饰p,地址,指针本身,是不能改变的,但指针指向的变量的内容是不能改变的
在这里插入图片描述

分享就到这了~

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

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

相关文章

蓝桥杯备战刷题(自用)

1.被污染的支票 #include <iostream> #include <vector> #include <map> #include <algorithm> using namespace std; int main() {int n;cin>>n;vector<int>L;map<int,int>mp;bool ok0;int num;for(int i1;i<n;i){cin>>nu…

Spring事务模板及afterCommit存在的坑

大家好&#xff0c;我是墨哥&#xff08;隐墨星辰&#xff09;。今天的内容来源于两个线上问题&#xff0c;主要和大家聊聊为什么支付系统中基本只使用事务模板方法&#xff0c;而不使用声明式事务Transaction注解&#xff0c;以及使用afterCommit()出现连接未按预期释放导致的…

JAVA算法和数据结构

一、Arrays类 1.1 Arrays基本使用 我们先认识一下Arrays是干什么用的&#xff0c;Arrays是操作数组的工具类&#xff0c;它可以很方便的对数组中的元素进行遍历、拷贝、排序等操作。 下面我们用代码来演示一下&#xff1a;遍历、拷贝、排序等操作。需要用到的方法如下 public…

APP的UI自动化demo(appium+java)

文章目录 appium连接手机java代码实现-第一版第二版-接入testng和隐式等待显示等待 appium连接手机 准备工作 1、查看连接手机模拟器是否连接成功&#xff0c;获取设备名称 执行命令&#xff1a;adb devices 2、查看android内核版本号—>paltformVersion 执行命令&#xf…

springBoot整合Redis(一、Jedis操作Redis)

在springboot环境下连接redis的方法有很多&#xff0c;首先最简单的就是直接通过jedis类来连接&#xff0c;jedis类就相当于是redis的客户端表示。 但是因为现在比较常用的是&#xff1a;StringRedisTemplate和RedisTemplate&#xff0c;所以jedis只做简单的介绍。 一、Jedis…

2023 龙蜥操作系统大会演讲实录:《兼容龙蜥的云原生大模型数据计算系统——πDataCS》

本文主要分三部分内容&#xff1a;第一部分介绍拓数派公司&#xff0c;第二部分介绍 πDataCS 产品&#xff0c;最后介绍 πDataCS 与龙蜥在生态上的合作。 杭州拓数派科技发展有限公司&#xff08;简称“拓数派”&#xff0c;英文名称“OpenPie”&#xff09;是国内基础数据计…

文献阅读:Transformers are Multi-State RNNs

文献阅读&#xff1a;Transformers are Multi-State RNNs 1. 内容简介2. 方法介绍 1. 基础回顾 1. RNN2. Transformer 2. Transformer解构 1. MSRNN2. Transformer 3. TOVA 1. 现有转换策略2. TOVA 3. 实验考察 & 结论 1. 实验设计2. 实验结果 1. LM2. 长文本理解3. 文本生…

仗剑天涯路 侠气传千古《有翡》湖北热血开播

由吴锦源执导&#xff0c;赵丽颖、王一博领衔主演&#xff0c;张慧雯、陈若轩、孙坚、周洁琼、张昕宇、冷纪元主演的古装武侠剧《有翡》&#xff0c;将于2月25日晚19:30登陆湖北卫视长江剧场。该剧改编自Priest小说《有匪》&#xff0c;讲述了南北朝年间&#xff0c;各方势力盘…

modbus-tcp协议详解

本文参考&#xff1a;Modbus协议中文版【完整版】.pdf&#xff0c;加上自己的理解的记录&#xff0c;该文章主要讲modbus-TCP协议。&#xff08;文档下载链接&#xff1a;【免费】modbus协议中文详细解释文档资源-CSDN文库&#xff09; 本系列文章分为三章&#xff1a; 1.mod…

Stable Diffusion 绘画入门教程(webui)-ControlNet(深度Depth)

上篇文章介绍了线稿约束&#xff0c;这篇文章介绍下深度Depth 文章目录 一、选大模型二、写提示词三、基础参数设置四、启用ControlNet 顾名思义&#xff0c;就是把原图预处理为深度图&#xff0c;而深度图可以区分出图像中各元素的远近关系&#xff0c;那么啥事深度图&#xf…

【README 小技巧】在项目README.md 中展示发布到使用的JDK 版本

在项目README.md 中展示发布到使用的JDK 版本 <a target"_blank" href"https://www.oracle.com/java/technologies/javase/jdk11-archive-downloads.html"><img src"https://img-home.csdnimg.cn/images/20230724024159.png?origin_urlhtt…

分布式知识整理

分布式锁 以商场系统超卖现象举例 超卖现象一 现象&#xff1a; 商品卖出数量超出了库存数量。 产生原因&#xff1a; 扣减库存的动作在程序中进行&#xff0c;在程序中计算剩余库存&#xff0c;在并发场景下&#xff0c;导致库存计算错误。 代码复现 es.shutdown(); cycl…

智慧应急与物联网相结合:物联网技术如何提升智慧应急响应能力

目录 一、引言 二、智慧应急与物联网技术的结合 三、物联网技术提升智慧应急响应能力的途径 四、物联网技术在智慧应急中的应用案例 五、物联网技术在智慧应急中面临的挑战与解决方案 挑战一&#xff1a;技术标准与规范不统一 解决方案&#xff1a; 挑战二&#xff1a;…

Linux之JAVA环境配置jdkTomcatMySQL

目录 一. 安装jdk 1.1 查询是否有jdk 1.2 解压 1.3 配置环境变量 二. 安装Tomcat&#xff08;开机自启动&#xff09; 2.1 解压 2.2 启动tomcat 2.3 防火墙设置 2.4 创建启动脚本&#xff08;设置自启动&#xff0c;服务器开启即启动&#xff09; 三. MySQL安装&#xff08;…

国漫年番成趋势?但只有这5部最值得看

自从《斗罗大陆》动画爆火之后&#xff0c;越来越多国漫都开始以年番形式播出&#xff0c;每周都能追自己喜欢的动画也是观众们所期待的。但其实年番对制作公司的要求很高&#xff0c;如果技术跟不上难免出现质量下滑的问题。今天就带大家盘点一下目前在播的最值得看的5部国漫年…

查看navicat保存的数据库连接密码

背景 经常使用navicat的朋友可能会碰到忘记数据库连接密码的情况&#xff0c;自然会想到navicat连接配置中就保存了密码。 个人经验&#xff0c;按以下步骤可查看密码明文 本人在mac上使用的navicat版本 1&#xff0c;导出connection_local.ncx 点击OK导出保存为connection_l…

基于频率增强的数据增广的视觉语言导航方法(VLN论文阅读)

基于频率增强的数据增广的视觉语言导航方法&#xff08;VLN论文阅读&#xff09; 摘要 视觉和语言导航&#xff08;VLN&#xff09;是一项具有挑战性的任务&#xff0c;它需要代理基于自然语言指令在复杂的环境中导航。 在视觉语言导航任务中&#xff0c;之前的研究主要是在空间…

Android RecyclerView 如何展示自定义列表 Kotlin

Android RecyclerView 如何展示自定义列表 Kotlin 一、前提 有这么一个对象 class DeviceDemo (val name: String, val type: String, val address: String)要展示一个包含这个对象的列表 bluetoothDevices.add(DeviceDemo("bb 9800", "LE", "32:…

Linux 内存管理概述(偏实战,略理论,附链接)

基础理论 1. 内存映射 可以参考&#xff1a; Linux内存映射 - 知乎 写的很详细&#xff0c;而且也有代码分析 2. 虚拟内存的空间分布 通过这张图你可以看到&#xff0c;用户空间内存&#xff0c;从低到高分别是五种不同的内存段。只读段&#xff0c;包括代码和常量等。数据段…

Unity学习之Unity中的MVC思想

文章目录 1 前言2 MVC的基本概念3 不使用MVC思想制作UI逻辑3.1 拼面板3.2 面板脚本3.3 角色面板逻辑3.4 角色升级 4 使用MVC思想制作UI逻辑4.1 Model数据脚本4.2 View界面脚本4.2.1 MainView主界面4.2.2 RoleView 角色面板界面 4.3 Controller业务逻辑脚本4.3.1 MainController…