【C语言】初识指针(终篇)
摸了一手秀发,发现还在~
目录
1、指针运算
1.1指针加减整数
1.2指针减指针
1.3指针关系运算
2、二级指针
3、指针和数组
4、指针数组
前言:
大家好,我是拳击哥。上一期我们讲到了指针类型,指针的访问步长,野指针概念。那今天我们就来讲点新的东西,东西不多就四个模块:指针运算、二级指针、指针和数组、指针数组。下面我就来介绍它们的用法。
初识指针(一)
初识指针(二)
1、指针运算
指针运算分为三种情况:
- 指针加减整数
- 指针减指针
- 指针的关系运算
1.1指针加减整数
指针加减整数是什么意思呢,就是指针在往前加或往后减造成一段数据发生改变。这就是指针加减的意义,它能使数据发生改变。我们拿加法来举例:
#include<stdio.h>#define N_VALUES 5int main()
{float values[N_VALUES] = { 1.2f,2.2f,3.2f,4.2f,5.2f };float* p;for (p = &values[0]; p < &values[N_VALUES];){*p++ = 0;}for (int i = 0; i < N_VALUES; i++){printf("%.0f ", values[i]);}return 0;
}
输出结果: 0 0 0 0 0
上述程序我依次来给大家讲解:首先初始化了一个单精度浮点型数组values有5个元素,并且定义了单精度浮点型指针变量p。大家不要认为这个程序很复杂,就是define定义了一个常量我把这个常量写得比较有逼格一点。大家容我细细道来。
第一个for循环()里面,让指针p指向values第一个元素的地址,并且p指向的地址<values最后一个元素的地址+1。这样造成什么呢,造成循环5次。
我们再看循环体内,第一次循环*p++=0,先对p解引用也就是先修改values第一个元素为0后再使p++也就是使p指向地址往前增长1。所以此时p指向的是values数组第二个元素的地址。直到最后p指向的地址超出了values数组最后一个数组元素地址,结束循环。
第二个for循环就是遍历values数组,依次打印被修改后的values的各个元素值。
相信大家对指针加法有了不一样的见解,指针加一就是使指针指向的地址往后增一。因此我可以先解引用当前地址并且修改当前地址值,或者再往后加一等等,可以实现各种您想要的结果。您学会了吗?
1.2指针减指针
理解了指针加法,减法也就不难理解了,也就是指针指向的地址往前减一,因此我可以得到上一个元素的地址或值。
1.3指针关系运算
指针关系运算是什么意思呢,就是比较两个指针之间的大小。两个指针的大小又用什么衡量呢,用指针指向的地址的大小来衡量。因此我们就不难理解指针关系运算是怎么回事了。
#include<stdio.h>int main()
{int arry[3] = { 1,2,3 };int* p1=arry;int* p2=arry+1;if (p1 > p2){*p1 = 0;}else{*p2 = 0;}for (int i = 0; i < 3; i++){printf("%d ", arry[i]);}
}
输出结果:1 0 3
上述程序很明显定义了p1指向arry数组的首地址,p2指向了arry数组的第二元素地址。因此p1<p2执行了*p2=0。这就是指针的关系运算,判断两个指针指向地址的大小从而进行一些操作。希望大家能够理解。
2、二级指针
平常我们定义的指针是一级指针如:int* p=NULL;只有一个*号这就是一个一级指针。那么二级指针就是有两个*号的指针如:int** pp=NULL;二级指针怎么用呢,有一代码:
#include<stdio.h>int main()
{int a = 10;int* p = &a;int** pp = &p;**pp = 20;printf("%d\n", a);return 0;
}
输出结果:20
上述代码,我来拆分讲解。首先我先定义了一个整型变量a=10、一个一级指针变量p指向a的地址和一个二级指针变量pp指向指针变量p的地址。
指针p存放的是a的地址,二级指针pp存放的是指针p的地址。然后对pp进行双解引用并把20赋值给双解引用后的pp,从而修改了a的值。结合下图来理解:
以上地址都是随机的,首先变量a里面存的是10,指针p里面存的是a的地址,二级指针pp里面存的是指针p的地址。
指针p可以通过a的地址找到10,那么二级指针pp是不是也能通过指针p的地址找到指针p里面存的a的地址值呢。但是如果我对二级指针pp解引用一次pp指针只能找到a的地址,所以我们解引用两次,就可以得到a了。这就是二级指针的用法。
有没有三级指针呢,准确来说是有的。指针可以无限套娃也就是可以增长到N级指针,只不过我们平常写代码时顶多用到了二级指针。一般情况没人用到三级和三级以上的指针。
3、指针和数组
往期内容我们知道了数组名的地址就是数组首元素地址,以下代码证实这个想法:
#include<stdio.h>int main()
{int arry[3] = { 1,2,3 };printf("%p\n", arry);printf("%p\n", &arry[0]);return 0;
}
输出结果:
001AF8F4
001AF8F4
可见数组名和数组首元素的地址是一样的。那么我们得出的结论是:数组名表示的是数组首元素的地址。
我们知道数组名是地址,指针变量指向的也是地址。那我们可不可以用指针来修改数组里面的各个值呢?是可以,我们来看一组代码,通过指针实现一个数组里面每个值都增加1:
#include<stdio.h>int main()
{int arry[] = { 1,2,3,4,5 };int n = sizeof(arry) / sizeof(arry[0]);int* p = arry;for (int i = 0; i < n; i++){arry[i] = *(p + i) + 1;}for (int j = 0; j < n; j++){printf("%d ", arry[j]);}return 0;
}
输出结果:2 3 4 5 6
以上结果说明了指针和数组不分家。指针p通过地址依次访问了arry里面的各个元素并使各个元素+1了。这就是指针与数组的关系,您学会了吗?
4、指针数组
我们先来玩个文字游戏,指针数组是指针,还是数组呢?答案是数组,就好比好兄弟,好兄弟是好还是兄弟呢,当然是兄弟了。凭啥认为指针数组是数组,我们来看一组代码:
#include<stdio.h>int main()
{int a = 10;int b = 11;int c = 12;int d = 13;int* arry[4] = { &a,&b,&c,&d };for (int i = 0; i < 4; i++){printf("%d ", *arry[i]);}return 0;
}
输出结果:
10 11 12 13
上述代码,arry是一个数组,有四个元素,每个元素是一个整型指针。arry数组里面的指针依次对应着abcd四个值的地址。因此我们认为指针数组就是一个数组。
有一代码,使用一维数组模拟一个三行四列的二维数组:
#include<stdio.h>int main()
{int a[4] = { 2,3,4,5 };int b[4] = { 6,7,8,9 };int c[4] = { 10,11,12,13 };int* arry[3] = { a,b,c };for (int i = 0; i < 3; i++){for (int j = 0; j < 4; j++){printf("%d ", arry[i][j]);}printf("\n");}return 0;
}
输出结果:
2 3 4
5 6 7
8 9 10
我们已经知道了,数组名就是地址。那么把分别把a、b、c三个数组的数组名存放在指针数组arry里面,这样我们就可以通过这三个数组名访问到各个数组的元素。以上方法使用指针数组实现了一维数组组成二维数组。
所有初识指针内容到这里就结束了,感谢您的观看。
Never Give Up
初识指针(一)和初识指针(二)
【C语言】初识指针(终篇)相关推荐
- c语言:初识指针(一)
初识指针 一.指针是什么 问题一:指针,指针变量,内存,地址,编号的关系 问题二:为什么指针大小是4或8字节 二.如何使用指针 三.指针类型 问题三:既然指针是4个字节,那它是如何放下long类型的呢 ...
- 【C语言】深入理解数组和指针——初识指针
哈喽大家好,我是保护小周ღ,C语言,接下来给大家带来的是深入理解数组和指针的初识指针,这篇主要讲的是基础指针的相关知识,是博主的所见所闻,细节上的知识后面会这里面没有提,会放在后期的文章中与数组相结合 ...
- 从0开始学c语言-终篇41-练习、学习分享
CSDN话题挑战赛第2期 参赛话题:学习笔记 终于,来到了终篇,我坚持做到了!每天一篇博客记录自己的学习(虽然中间有两天去干农活而断更了)!啊呜呜呜呜~激动! 但是,这不会是我的终点,这是新的起点.之 ...
- 速通C语言第一站 一篇博客带你初识C语言
感谢佬们支持! 文章目录 前言 一.C语言的前世今生&&如何写C语言 二.初识C语言 1. 第一个C语言程序(万恶之源) 2. 数据类型 计算机中的单位 介绍各种类型 各数据类型的 ...
- C语言重点——指针篇(一篇让你完全搞懂指针)
C语言重点--指针篇(一篇让你完全搞懂指针) 一. 前言 C语言是比较偏底层的语言,为什么他比较偏底层,就是因为他的很多操作都是直接针对内存操作的. 这篇我们就来讲解C语言的一大特点,也是难点,指针和 ...
- [C语言]static关键字--#define 定义常量和宏--初识指针--初识C语言(四)
文章目录 前言 一,static关键字 二,#define 定义常量和宏 三,初识指针 总结 前言 本节主要记录初识C语言第四节内容. 内容包括:static关键字------#define 定义常量 ...
- c语言 乘号 指针 避免,C语言指针篇(一)指针与指针变量
指针 1. 什么是指针? 2. 指针可不可怕? 3. 指针好不好玩? 4. 怎么学好指针? C语言是跟内存打交道的语言,指针就是内存地址.指针无处不在,指针并不可怕,相反,等你学到一定程度后,会有一种 ...
- C语言指针(基础篇)
文章目录 前言 一.指针与地址 1. 变量与内存 2. 地址与指针 3. 常量.变量.内存.地址.指针的关系 二.指针的基础操作 1.大端模式与小端模式 2. 指针的定义与初始化 2.1 指针的定义与 ...
- 【C指针】初识指针,轻松了解指针
⭐博客主页:️CS semi主页 ⭐欢迎关注:点赞收藏+留言 ⭐系列专栏:C语言初阶 ⭐代码仓库:C Advanced 家人们更新不易,你们的点赞和关注对我而言十分重要,友友们麻烦多多点赞+关注,你们 ...
最新文章
- 程序员关注的高质量公众号
- 二十二、 深入Python的进程和线程(上篇)
- 全国计算机等级考试题库二级C操作题100套(第73套)
- 2万字详解,彻底讲透 全文搜索引擎 Elasticsearch
- Linux安装Java
- 随想录(移动app下的生活)
- 【白皮书分享】2020胡润大健康白皮书-胡润百富.pdf(附下载链接)
- Cubic interpolation立方插值
- 奇门遁甲鸣法 第五章 辅格
- android studio应用开发案例,Android应用开发案例教程(Android Studio版).pptx
- oracle打cve补丁,Oracle多个产品高危漏洞补丁安全预警
- android简单点餐系统_微信点餐收银系统哪个好用?
- python打开网页后点击网页按钮_单击网页按钮的Python脚本
- Golang并发下的数据结构及其底层剖析
- 看了阿里大佬用的本地缓存,那叫一个优雅!
- ProcessOn第一次使用教程
- CMW500注网问题
- BROCADE交换机配置
- 非常好用的PC端软件,个个都是宝藏!
- java中遍历数组_java循环取数组值
热门文章
- set接口-存储及遍历、HashSet、LinkedHashSet、TreeSet
- PPT的常用技巧(1):
- SPA项目开发之CRUD+表单验证
- 导入excel,excel中带有图片,记录一下
- 对3D体感试衣镜的看法
- 四十三 iOS中UILabel部分字体颜色的修改
- 视频直播,音频直播,m3u8
- (15)[ICML13] Momentum: On the importance of initialization and momentum in deep learning
- U-BOOT 下载 GitHub
- “无须”与“无需”最简易区别法