详解指针(2)(初阶版)

news2024/9/29 16:14:41

前言:内容包括:指针运算,指针和数组,二级指针,指针数组

详解指针(1)(点击即跳转)

 part 1:指针运算

1 指针+-整数

以如下代码为例:初始化数组内容全为0

#define N_VALUES 5
float values[N_VALUES];
float *vp;

for (vp = &values[0]; vp < &values[N_VALUES];)
{
    *vp++ = 0;
}

*vp++:后置++只作用于vp指针,后置++是先使用再++,故而此操作是*vp=0,vp++

vp++:跳过一个float类型的大小,由于数组中的元素都是float类型,故而vp++,跳过一个元素

最终for循环结束的条件是vp=&values[N_VALUES],即指针vp指向了最后一个元素后面的那一块空间,但需要注意,这不是越界访问,因为vp指针只是指向了那一块不属于数组的空间,却并没有访问

2 指针-指针 

注意:两个指针必须指向同一块区域,两个指针的类型必须相同

           指针-指针就是指针和指针之间的元素个数  (指针就是地址)

           但有正负之分:小地址-大地址:元素个数带负号

                                     大地址-小地址:元素个数是正数

以如下代码为例:求字符串长度

int my_strlen(char *s)
{
    char *p = s;
    while(*p != '\0' )
           p++;
    return p-s;
}

字符型指针接收字符串的首个字母的地址

 故而求出的字符串长度是6

3 指针的关系运算

 以如下代码为例:初始化数组内容为0

#define N_VALUES 5
float values[N_VALUES];
float *vp;

for(vp = &values[N_VALUES]; vp > &values[0];)
{
    *--vp = 0;
}

*--vp:vp先-1,然后对vp解引用:*vp

或许有人会这么简化以上代码:可能更容易理解

for(vp = &values[N_VALUES-1]; vp >= &values[0];vp--)
{
    *vp = 0;
}

 

虽然再绝大部分编译器上这样做是没有问题的,但是我们还是要避免这样些,因为标准并不保证它可行 

标准规定:
允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较

 黑色的是属于数组的空间,蓝色是不属于数组的空间

标准规定:指针p1可以和p2比较,但是指针p1不能与p3比较

故而第二种即使容易理解,但是我们要避免写出这种代码

part 2:指针和数组

指针可以指向数组元素,故而可以通过指针来访问数组的每一个元素

int main()
{
    int arr[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    int *p = arr; //指针存放数组首元素的地址
    int sz = sizeof(arr) / sizeof(arr[0]);//数组元素个数
    int i = 0;
    for (i = 0; i<sz; i++)
    {
        printf("%d ", *(p + i));
    }
    return 0;
}

p+i:指向的是arr数组中下标为i的元素

*(p+i)就可以拿到下标为i的元素

part 3:二级指针

二级指针存放的是一级指针的地址

一级指针存放的是变量的地址

这里所有的地址都是假设的,现有变量a=10,一级指针pa,二级指针ppa

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

int*pa : *表示pa是指针,int表示pa指向的对象(a)是int类型

int**ppa:*表示ppa是指针,int*表示ppa指向的对象(pa)是int*类型(即一级指针) 

 *pa(对一级指针解引用一次)可以找到a

**ppa(对二级指针解引用两次)可以找到a

**ppa = 30;
//等价于*pa = 30;
//等价于a = 30;

*ppa:找到的是pa,访问到的是pa

int b = 20;
*ppa = &b;//等价于 pa = &b;

part 3:指针数组

指针数组是数组,是存放指针的数组

int* arr3[5];

arr3是一个数组,有五个元素,每个元素是一个整形指针
实例:使用指针数组模拟二维数组

int main()
{
	int arr1[] = { 1,2,3,4 };
	int arr2[] = { 5,6,7,8 };
	int* str[] = { arr1,arr2 };
	int i = 0;
	for (i = 0; i < 2; i++)
	{
		int j = 0;
		for (j = 0; j < 4; j++)
		{
			printf("%d ", str[i][j]);
		}
		printf("\n");
	}
	return 0;
}

模拟两行4列的二维数组,每一行都是一个一维数组

str[i][j]:str[i]就是某个一维数组的数组名,j就是一行中某个元素的下标

             就像我们平常访问一个一维数组一样,现有int arr[]={1,2,3}

            我们是通过arr[i]的方式访问arr数组的每个元素的

             arr[0]:第一个元素,arr[1]:第二个元素,arr[2]:第三个元素

            我们可以发现,数组名[下标] :数组中的某个元素

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

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

相关文章

实验名称:经典同步问题:生成者与消费者问题

实验名称&#xff1a;经典同步问题&#xff1a;生成者与消费者问题 相关知识 信号量 信号量是用来协调不同进程间的数据对象&#xff0c;可用来保护共享资源&#xff0c;也能用来实现进程间及同一进程不同线程间的进程同步。分为二值信号灯和计算信号灯两种类型。 进程与线…

VOC数据增强与调整大小

数据增强是针对数据集图像数量太少所采取的一种方法。 博主在实验过程中&#xff0c;使用自己的数据集时发现其数据量过少&#xff0c;只有280张&#xff0c;因此便想到使用数据增强的方式来获取更多的图像信息。对于图像数据&#xff0c;我们可以采用旋转等操作来获取更多的图…

Android Dalvik虚拟机 堆初始化流程

前言 上篇文章介绍了dalvik虚拟机启动流程&#xff0c;在dalvik虚拟机启动时调用了dvmGcStartup来启动堆。 本文介绍我们在日常开发使用Java时的堆创建流程。 Dalvik堆介绍 Dalvik虚拟机中&#xff0c;堆是由heap[0] Active堆和heap[1] Zygote堆两部分组成的。其中&#xff…

13 Day:实现内核线程

前言&#xff1a;我们昨天完成了内核的内存池以及内存管理程序&#xff0c;今天我们要揭开操作系统多任务执行的神秘面纱&#xff0c;来了解并实现一个多任务的操作系统。 一&#xff0c;实现内核线程 在聊线程之间我们先聊聊处理器吧&#xff0c;众所周之现在我们的CPU动不动…

心跳太快对身体带来影响?4种方法来减速!

心脏每时每刻都在跳动&#xff0c;跳动时遵循一定的节律。正常情况下成年人每分钟心跳达到60~120下&#xff0c;若心跳每分钟大于120下&#xff0c;被判断为心动过速&#xff1b;若心跳每分钟不足50下&#xff0c;被判断为心动过缓&#xff0c;无论是哪种因素均会影响身体健康。…

详解Redisson分布式限流的实现原理

我们目前在工作中遇到一个性能问题&#xff0c;我们有个定时任务需要处理大量的数据&#xff0c;为了提升吞吐量&#xff0c;所以部署了很多台机器&#xff0c;但这个任务在运行前需要从别的服务那拉取大量的数据&#xff0c;随着数据量的增大&#xff0c;如果同时多台机器并发…

如何用Python打包好exe文件,并替换图标

前言 Python打包&#xff1f;打包exe文件&#xff1f;怎么操作&#xff1f; ok&#xff0c;今天我来分享分享&#xff0c;教你们如何打包号文件&#xff0c;顺便还来展示一下&#xff0c;如何替换好图标 首先把你的代码准备好&#xff0c;尽量不要中文路径&#xff0c;容易报…

flex 布局

设为 Flex 布局以后&#xff0c;子元素的float、clear和vertical-align属性将失效。 flex 和 inline-flexflex&#xff1a; 将对象作为弹性伸缩盒显示inline-flex&#xff1a;将对象作为内联块级弹性伸缩盒显示<style>.main {background-color: #0f0;display: flex; /*父…

【VictoriaMetrics】VictoriaMetrics启停脚本

先看结果,启动VictoriaMetrics UI界面可访问

有趣的Hack-A-Sat黑掉卫星挑战赛——定位卫星Jackson

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

图解LeetCode——剑指 Offer 53 - I. 在排序数组中查找数字 I

一、题目 统计一个数字在排序数组中出现的次数。 二、示例 示例 1 【输入】nums [5,7,7,8,8,10], target 8 【输出】2 示例 2: 【输入】nums [5,7,7,8,8,10], target 6 【输出】0 提示&#xff1a; 0 < nums.length < 10^5-10^9 < nums[i] < 10^9nums 是一…

基于Java+SpringBoot+SpringCloud+Vue前后端分离医院管理系统设计与实现

博主介绍&#xff1a;✌全网粉丝3W&#xff0c;全栈开发工程师&#xff0c;从事多年软件开发&#xff0c;在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建、毕业项目实战、项目定制✌ 博主作品&#xff1a;《微服务实战》专栏是本人的实战经验总结&#xff0c;《S…

一文总结 JUC 并发编程

文章目录一、JUC 并发编程二、协调锁1. Synchronized2. Synchronized 锁下线程通信3. Lock 锁4. Lock 锁实例 - ReentrantLock5. 读写锁 - ReadWriteLock三、CAS & 原子类1. CAS2. 原子类2.1 基础原子类2.2 数组类型原子类2.3 引用型原子类四、线程1. Callable 和 Future2.…

Filter防火墙(8)

实验目的 1、了解个人防火墙的基本工作原理&#xff1b; 2、掌握Filter防火墙的配置。 预备知识防火墙 防火墙&#xff08;Firewall&#xff09;是一项协助确保信息安全的设备&#xff0c;会依照特定的规则&#xff0c;允许或是限制传输的数据通过。防火墙可以是一台专属的硬…

Linux防火墙(7)

实验目的 通过该实验了解Linux防火墙iptables实现原理&#xff0c;掌握iptables基本使用方法&#xff0c;能够利用iptables对操作系统进行加固。预备知识基本原理 netfilter/iptables&#xff08;简称为iptables&#xff09;组成Linux平台下的包过滤防火墙&#xff0c;具有完成…

拉普拉斯矩阵的定义,常见的几种形式以及代码实现?

拉普拉斯矩阵 拉普拉斯矩阵(Laplacian matrix) 也叫做导纳矩阵、基尔霍夫矩阵或离散拉普拉斯算子,主要应用在图论中,作为一个图的矩阵表示。对于图 G=(V,E),其Laplacian 矩阵的定义为 L=D-A,其中 L 是Laplacian 矩阵, D=diag(d)是顶点的度矩阵(对角矩阵),d=rowSum(A),…

【Java 面试合集】简述下Java的三个特性 以及项目中的应用

简述下Java的特征 以及项目中的应用 1. 概述 上述截图中就是Java的三大特性&#xff0c;以及特性的实现方案。接下来就每个点展开来说说 2. 封装 满足&#xff1a;隐藏实现细节&#xff0c;公开使用方法 的都可以理解为是封装 而实现封装的有利手段就是权限修饰符了。可以根据…

【MT7628】开发环境搭建-安装Fedora12

1.下载Fedora安装镜像 1.1链接地址 http://dl.fedoraproject.org/pub/archive/fedora/linux/releases/12/Fedora/i386/iso/ 1.2选择如下截图的软件包下载 1.3下载完成的软件包名称

06分支限界法

文章目录八数码难题普通BFS算法全局择优算法&#xff08;A算法&#xff0c;启发式搜索算法&#xff09;单源最短路径问题装载问题算法思想&#xff1a;队列式分支限界法优先队列式分支限界法布线问题最大团问题批处理作业调度问题分支限界法与回溯法的区别&#xff1a; &#x…

已解决sc delete MongoDB卸载MongoDB拒绝访问。

已解决sc delete MongoDB卸载MongoDB拒绝访问。 文章目录报错问题报错翻译报错原因解决方法联系博主免费帮忙解决报错报错问题 粉丝群里面的一个小伙伴遇到问题跑来私信我&#xff0c;想卸载MongoDB数据库&#xff0c;但是发生了报错&#xff08;当时他心里瞬间凉了一大截&…