[C语言]初步的来了解一下指针(多图详解)

news2024/11/23 4:07:58

       

目录

       

        1.指针是什么

        2.指针类型

        2.1指针类型的意义(+-整数)

        2.2指针的解引用

        3.野指针

        3.1野指针出现的情况

             3.2 如何规避野指针

        4.指针运算

                4.1指针+-整数

                 4.2指针-(减)指针

        5.二级指针       


        1.指针是什么

                指针是内存中最小的单元编号,也就是地址。指针还可以是一种指针变量

                内存:

                当我们平时在创造一个变量后,内存会开辟出相应的空间来存放这一数据,例如在创建一个float变量并赋值后,开辟了四个字节来存放,每一个字节都有相应的地址来对应

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

         2.指针类型

                像整型和浮点型都有不同的类型,int,short,float等等,相应的指针也有着不同的类型         

        如下: 

(在定义指针的时候要将其初始化,但如果没有可以指向的变量,一般用NULL空指针表示)

char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;

                对于指针的定义可以看出来为:类型 + *

                不同类型的指针来存放不同类型类型变量的地址

                char*类型的指针存放char类型变量的地址

                 int*类型的指针存放int类型变量的地址

                以此类推……

        2.1指针类型的意义(+-整数)

                指针类型的不同除了代之存放变量类型,还可以根据不同类型的字节的不同来进行操作

                举例说明:

                int类型为‘4’字节数

                char类型为‘1’字节数

int main()
{
	int a = 10;
	int* pa = &a;
	char* pc = &a;
	
	printf("a=%d\n\n", a);

	printf("pa=%p\n", pa);
	printf("pa+1=%p\n\n", pa + 1);

	printf("pc=%p\n", pc);
	printf("pc+1=%p\n", pc + 1);
	return 0;
}

                打印结果:

                对此,我们可以发现:

         同样是+1为什么差别这么大呢?原因就正是在指针类型的不同上,不同字节的指针类型+1所得到的地址是:原地址 + 整数*(sizeof(指针类型))

        char*类型一次访问1个字节,+1跳过1个字节

        int*类型一次访问4个字节,+1跳过4个字节

        可能有人有疑问说:

        Q:为什么int类型的变量的地址可以放到char*类型中呢?

        A:指针变量都是用来存放地址的,类型的不同只是使得他们的意义不同。

        总结:指针的类型决定了指针向前或者向后走一步有多大(距离),这一点在下面解引用也有所体现。


        2.2指针的解引用

                解引用通俗的来说,就是根据地址去寻找所存储的内容

                *pa = a

                但在指针变量的声明或定义中并不是解引用,只是创建一个 (int*)类型的指针变量

                 对于不同的指针类型,对指针解引用的权限也是不同的,这一点跟指针类型的意义中整数的+-有所类似

                 对比两个例子可以看出,char*类型指针只具有一个字节,所以在解引用后只有一个字节的权限,再次赋值时也只能改变一个字节。如果使用char*类型指针想要将a赋值为0,则要循环语句逐一的将四个字节都赋值为0

                而int*类型指针具有四个字节,在解引用后具有四个字节的权限,所以在赋值时可以一次将四个字节都赋值为0。

                char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节

                 在对机器大小端的判别时,就运用到了这个知识点。具体举例在以下文章:

                [C语言]和我一起来认识“整型在内存中的存储”_HY_PIGIE的博客-CSDN博客

 3.野指针

        野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)

        3.1野指针出现的情况

1.指针未初始化

int* p;
*p = 20;

2.指针越界访问

int arr[10] = {0};
int *p = arr;
for(int i = 0;i <= 10;i++)
{
    *(p++) = i;//当i=10时超出数组的范围,p就为野指针
}

             3.2 如何规避野指针


                1. 指针初始化
                2. 小心指针越界
                3. 指针指向空间释放,及时置NULL
                4. 避免返回局部变量的地址
                5. 指针使用之前检查有效性

        4.指针运算

                4.1指针+-整数

int arr[9] = {0};
int* pa = null;
for(pa = &arr[0];pa < &arr[9])
{
    *pa++ = 0;
}

             

                数组为int类型,取得首元素的地址也即为数组的地址。

                获取地址的指针类型为int*(四字节),*运算符的优先级高于++的优先级

                所以先是*pa = 1,赋值后再

                *pa++,地址+1

                因为是int*类型,+1等价于加上四个字节即一个整数位,所以相当跳过一个数组单位

                得出:当i++变化时,pa = arr。有:

                pa+i =arr[i]; 

                 4.2指针-(减)指针

    char arr[] = "abcdef";
	char* pa = arr;    //数组首元素的地址
	while (*pa != '\0')
	{
		pa++;当没有遇到字符串结尾的‘\0’,就++
	}
	int len = pa - arr;//两个指针相减,得到++的差值,便是字符串的长度
	printf("%d", len);

        5.二级指针       

        指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针

        像ppa这种取指针地址的指针称为二级指针。
          5.1二级指针的运算

        

                 本文章目前就到此为止了,如有不对的地方欢迎留言指正。

                谢谢观看

                

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

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

相关文章

录屏软件电脑版免费哪个好?4款免费屏幕录制软件下载

在电脑上经常能使用的录屏功能&#xff1a;录制软件的操作过程、精彩的游戏瞬间、经典的影视故事、网络教学等。许多人都在问&#xff0c;录屏软件电脑版哪个好&#xff1f;Windows平台上有很多录屏软件&#xff0c;如果对录屏需求不高的朋友&#xff0c;可以通过内置的视频软件…

08线性回归+基础优化算法

P2基础优化算法 1.最常见的优化算法——梯度下降&#xff0c;用在模型没有显示解的情况下&#xff08;线性回归有显示解&#xff0c;但是现实中很少有这样理想的情况&#xff09; 2.梯度下降的实现方法&#xff1a;沿着反梯度更新方向参数求解 解释&#xff1a; 超参数&#x…

HTTP_day03

当键入网址后&#xff0c;到网页显示&#xff0c;其间发生了什么&#xff08;下&#xff09; 掘金地址 键入 localhost ,通过 Wireshark 抓包分析&#xff0c;抓包结果如下图所示 抓包结果 我们知道 HTTP 协议是运行在 TCP/IP 基础 之上的。 浏览器 通过 HTTP 接收和发送数据…

怎么才能写出好的代码

前言这是一篇如何写好代码的水文&#xff0c;因为最近输出了不少干货&#xff0c;但是大家点赞太少&#xff0c;我越来越没有激情了&#xff0c;那就放放水啦。所以如果大家觉得我的分享对你有用&#xff0c;动动发财小手&#xff0c;赞起来吧&#xff01;虽然是一篇水文&#…

谷粒学苑项目-第一章数据库设计与项目结构-1.1

一、数据库设计 1、数据库 guli2、数据表 CREATE TABLE edu_teacher (id char(19) NOT NULL COMMENT 讲师ID,name varchar(20) NOT NULL COMMENT 讲师姓名,intro varchar(500) NOT NULL DEFAULT COMMENT 讲师简介,career varchar(500) DEFAULT NULL COMMENT 讲师资历,一句话说…

Java--经典九道练习题

文章内容 一、用户登录 二、遍历字符串 三、统计字符个数 四、拼接字符串 五、字符串反转 六、金额转换&#xff08;较难&#xff09; 七、手机号屏蔽 八、身份证号码信息查看 九、游戏骂人敏感词替换 一、用户登录 一直正确的用户名和密码&#xff0c;请用程序实现模…

获取当前进程的启动程序

本文迁移自本人网易博客&#xff0c;写于2012年3月23日&#xff0c;获取当前进程的启动程序 - lysygyy的日志 - 网易博客 (163.com)1.获取当前进程的启动程序CString sFile;GetModuleFileName(NULL, sFile.GetBuffer(), 255);2.获取文件类型3.Autocad文档交互时&#xff0c;使用…

Camera | 1.Camera基础知识

一口君最近在玩瑞芯微的板子&#xff0c;之前写了几篇基于瑞芯微的文章&#xff0c;大家可以学习一下。 《瑞芯微rk356x板子快速上手》 《Linux驱动|rtc-hym8563移植笔记》 《Linux驱动 | Linux内核 RTC时间架构》 《瑞芯微 | 摄像头ov13850移植笔记》 《rk3568 | 瑞芯微平…

图的生成树与生成森林

文章目录连通图与连通分量强连通图与强连通分量图的连通性判断生成树深度优先生成树邻接表邻接矩阵广度优先生成树邻接表邻接矩阵生成森林获取边弧的权值源代码连通图与连通分量 在无向图中, 若从顶点v到顶点w有路径存在, 则称v和w是连通的. 若图G中任意两个顶点都是连通的, 则…

动态规划--矩阵链相乘问题

明确原始问题A[1:n]&#xff1a;计算矩阵链 所需的最小乘法次数。 &#xff08;1&#xff09;是否满足最优子结构&#xff0c;问题的解是否包含子问题的优化解&#xff1f; 若计算A[1:n]的优化顺序在k处断开矩阵链&#xff0c;即A[1:n]A[1:k]A[k1:n],则在A[1:n]的优化顺序中&a…

ReFactor GNN:从消息传递角度重新审视FMs

分享嘉宾 | 陈艺虹 文稿整理 | William Knowledge Graph Completion(KGC) 知识图谱一般会有多个节点&#xff0c;包括性别、国家等各种各样的节点(也可理解为实体)&#xff0c;节点之间会有不同的关系&#xff0c;可以通过其他的一些节点预测出当前节点的其他信息。恢复这些信…

2023/1/6 Vue学习笔记-1

尝试 Vue.js 最简单的方法是使用 Hello World 例子。你可以在浏览器新标签页中打开它&#xff0c;跟着例子学习一些基础用法。或者你也可以创建一个 .html 文件&#xff0c;然后通过如下方式引入 Vue&#xff1a; <!-- 开发环境版本&#xff0c;包含了有帮助的命令行警告 -…

设计模式——建造者模式

文章目录模式理解基本概念使用示例建造者模式延展模式理解 建造者模式&#xff08;Builder Pattern&#xff09;&#xff1a;建造者模式是一种对象创建型模式。将一个复杂对象的构建与它的表示分离&#xff0c;使得同样的构建过程可以创建不同的表示。这句话理解起来太抽象了&…

B. Dima and a Bad XOR(构造 + 异或性质)

Problem - 1151B - Codeforces 来自Kremland的学生Dima有一个大小为nm的非负整数矩阵a。 他希望从矩阵的每一行中选择一个整数&#xff0c;以便所选整数的按位互斥或严格大于0。帮助他! 形式上&#xff0c;他想选择一个整数序列c1,c2&#xff0c;…&#xff0c;cn(1≤cj≤m)&am…

Integer包装类详解(java)

文章目录&#x1f4d6;前言&#xff1a;&#x1f380;包装类概念&#xff1a;&#x1f380;包装类分类&#xff1a;&#x1f380;包装类integer介绍&#xff1a;&#x1f387;自动装箱和自动拆箱问题【⚠注意面试常考点】&#x1f387;Integer常用方法&#xff1a;&#x1f4d6…

2023真无线蓝牙耳机推荐:高性价比真无线蓝牙耳机各价位蓝牙耳机推荐!

2023年了&#xff0c;蓝牙耳机赛道依然很卷&#xff01;性价比是反映物品可买程度的一种量化的计量方式。现如今&#xff0c;蓝牙耳机市场上主打高性价比的不在少数&#xff0c;而高性价比的东西往往更能精准抓住用户“痛点”&#xff0c;从而受到了不少用户的欢迎。 既然高性…

面试20分钟就完事了,问的实在是太......

干了两年外包&#xff0c;本来想出来正儿八经找个互联网公司上班&#xff0c;没想到算法死在另一家厂子。 自从加入这家外包公司&#xff0c;每天都在加班&#xff0c;钱倒是给的不少&#xff0c;所以也就忍了。没想到11月一纸通知&#xff0c;所有人不许加班&#xff0c;薪资…

Spring Boot整合Junit

系列文章目录 Spring Boot[概述、功能、快速入门]_心态还需努力呀的博客-CSDN博客 Spring Boot读取配置文件内容的三种方式_心态还需努力呀的博客-CSDN博客 该系列文章持续更新中~ 目录 系列文章目录 前言 一、搭建SpringBoot工程 二、引入starter-test起步依赖 三、编…

2022年全国研究生数学建模竞赛华为杯F题COVID-19疫情期间生活物资的科学管理问题求解全过程文档及程序

2022年全国研究生数学建模竞赛华为杯 F题 COVID-19疫情期间生活物资的科学管理问题 原题再现&#xff1a; 一、背景介绍   进入2022年以来全国范围内陆续出现了多次较大规模疫情爆发事件[1-2]。在大规模疫情爆发期间由于我国采用封闭式管理方式来实现疫情的快速清零&#x…

Vue组件之间的通信(组件之间的数据传递)

一、Vue组件之间的关系 父子关系&#xff1a;A组件和B组件、B组件和C组件、B组件和D组件​ 兄弟关系&#xff1a;C组件和D组件​ 隔代关系&#xff1a;A组件和C组件、A组件和D组件 二、父组件向子组件传递数据 通过props方式向子组件传递数据&#xff08;在子组件中添加props属…