C语言--指针与数组

news2024/12/24 11:31:26

目录

  • 指针运算(补)
    • 指针+指针
    • 指针的关系运算(补)
  • 指针与数组
    • 数组名
    • 二级指针
    • 指针数组

指针运算(补)

指针+指针

上一篇博客我们介绍了指针运算中的三种常见运算:指针±整数,指针关系运算,指针-指针。,但类比常数的关系运算,我们好像还少了一个指针+指针的运算,那么在C语言中的指针+指针到底有没有意义呢,实际上这种运算是没有什么意义的
举个例子,如图1:
图1
日期加天数能等到另一个日期,类比指针加整数得到一个新指针。
日期减日期能得到天数,类比数组指针两两相减得到其中的元素个数。
而日期加日期貌似就没有什么意义了,类比指针加指针也是如此。

指针的关系运算(补)

我们来分析下面这两段代码
代码1

#define N_VALUES 5
int main()
{
	int values[N_VALUES] = { 0,1,2,3,4 };
	int* vp = 0;
	for (vp = &values[N_VALUES]; vp > &values[0];)
	{
		*--vp = 0;
		printf("%d", *vp);
	}
}

代码2

#define N_VALUES 5
int main()
{
	int values[N_VALUES] = { 0,1,2,3,4 };
	int* vp = 0;
	for (vp = &values[N_VALUES]; vp > &values[0];vp--)
	{
		*vp = 0;
		printf("%d", *vp);
	}
}

代码1分析如图2
虽然一开始vp被赋予的地址是超出限制范围的,但是在for循环中首先经历了一次自减,访问下标就来到了4的位置,这时候就不会越界访问了,(越界访问只存在于解引用期间,只要还没有解引用,就没有越界访问

图2
代码2分析如图3
图3
和代码2相反的是,一开始并没有越界,而在最后再进行了一次自减后越界了,不过同样没有解引用就跳出循环了,乍一看二者其实并没有什么太大区别,但C语言规定:允许指向数组元素的指针与指向数组最后一个元素后面的那个内存位置的指针比较,但是不允许与
指向第一个元素之前的那个内存位置的指针进行比较。

指针与数组

数组名

什么是数组名呢?我们来看一段代码:

int main()
{
	int arr[10] = { 0 };
	printf("%p\n", arr);
	printf("%p\n", &arr[0]);

	return 0;
}

运行结果如图3
图3
从代码和运行结果我们可以得出结论:数组名是数组首元素的地址。
既然可以把数组名当成地址存放到一个指针中,我们使用指针来访问一个就成为可能。看下面这段代码

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

运行结果如图4
图4
由图我们可以得出:p+i其实就是访问下标为i的元素的地址。
那么我们利用这个特点就可以直接通过指针来访问数组。
看下面这段代码

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;
}

代码运行结果如图5
图5

二级指针

看到这个名词可能会联想到数学中学过的二阶求导,我们把取地址和求导类比一下,指针变量也是变量,是变量就会有地址来存放这个变量,就如同一阶导数本质上还是一个函数,其同样存在导数而且二级指针的写法和二阶导数写法如出一辙,如图6
图6
这样类比理解起来就要容易多了。

指针数组

指针数组和数组指针要区分开来,数组指针是指存放数组的地址,而指针数组是指存放指针的数组。
而指针同样也分整形指针数组(即这个数组内都存放的是整形元素的地址),字符指针数组(即这个数组内都存放的是字符元素的地址),类比如图7
图7
以上就是本篇文章全部内容,如有出入,欢迎各位大佬指正

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

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

相关文章

关于android studio安装篇

前言&#xff1a;本文安装环境为windows系统&#xff0c;调试环境AVD&#xff08;电脑上运行的“虚拟手机”&#xff09;&#xff0c;安装android studio之前需安装jdk&#xff0c;配置好jdk的环境变量。解释&#xff1a;android运行调试环境有三种方式&#xff0c;真机、AVD&a…

基于uboot的truested安全启动模式进行TF-A源码移植

步骤 1. 对源码进行解压 tar -xvf tf-a-stm32mp-2.2.r2-r0.tar.gz2. 将补丁文件全打上 for p in ls -1 ../*.patch; do patch -p1 < $p; done3. 配置交叉编译工具链&#xff0c;在TF-A顶层目录下打开Makefile.sdk文件修改&#xff0c;搜索cross_compile&#xff0c;然后进…

5.组件钩子函数

目录 1 生命周期与钩子函数 2 创建时 3 更新时 3.1 执行顺序 3.2 触发条件 3.3 componentDidUpdate() 4 卸载时 1 生命周期与钩子函数 类组件从 被挂载到页面中运行&#xff0c;到组件不用时卸载 之间是组件的生命周期 只有类组件才有生命周期 生命周期的每个…

MATLAB算法实战应用案例精讲-【数模应用】概率生成模型(Generative Model)(补充篇)

前言 几个高频面试题目 非概率模型和概率模型的区别 非概率模型 非概率模型指的是直接学习输入空间到输出空间的映射h,学习的过程中基本不涉及概率密度的估计,概率密度的积分等操作,问题的关键在于最优化问题的求解。通常,为了学习假设 ,我们会先根据一些先验知识(pri…

道路千万条,安全第一条

我是腾讯安全的冯帆&#xff0c;主要在MMS安全服务团队负责交通行业保障工作。每年春节对交通行业来说都是一次考验&#xff0c;尤其是今年春运&#xff0c;也是三年来最具规模的一次“大考”。因此我们今年投入的人力&#xff0c;包括值守团队&#xff0c;也是这些年最多的一次…

Eclipse中的Classpath及【其与buildpath之间的关系】

Eclipse中的Classpath及【其与buildpath之间的关系】简介.classpath文件设置和查看方法通过eclipse设置通过Java代码设置通过eclipse菜单查看通过Java代码输出查看classpath及与buildpath之间的关系简介 Classpath .classpath文件 .classpath文件用于记录项目编译环境的所有…

第五届字节跳动青训营 前端进阶学习笔记(九)Node.js 与前端开发实战

文章目录前言Node.js的应用场景1.典型应用场景Node.js运行时结构特点Node.js实战1.搭建一个基本的http服务器2.返回json数据3.编写一个简单的静态服务器4.SSR5.调试6.部署总结前言 本堂课程重点内容&#xff1a; Node.js的应用场景Node.js的运行时结构Node.js实战 Node.js的应…

使用Markdown写出一份漂亮的简历

文章目录背景Markdown编辑器开始写你的简历个人优势项目经历            牧竹子个人技能公司经历项目经验XXXXXX项目 202N.N0.15-202N.N.N导出文档格式高级版修改样式背景 每当你要更新简历时是否因为各个平台不同输入框而陷入适配不同的模板&#xff0c;如此以来为…

全球开源学习平台Moodle

今天是正月初九&#xff0c;老苏开始上班了&#xff0c;起航新程&#xff0c;开工大吉&#xff01; 什么是 Moodle &#xff1f; Moodle 是一个开源的在线教育系统&#xff08;慕课&#xff09;。旨在为教育工作者、管理人员和学习者提供一个强大、安全且集成的系统&#xff0c…

DP背包问题

目录 一、前言 二、0/1背包 1、装箱问题&#xff08;lanqiaoOJ题号763&#xff09; 2、2022&#xff08;2022年国赛填空题&#xff0c;lanqiaoOJ题号2186&#xff09; 三、完全背包 1、小明的背包2&#xff08;lanqiaoOJ题号1175&#xff09; 四、分组背包 五、多重背包…

Kylin 4.0.1 分布式集群安装部署

目录1. 安装依赖2. 安装Kylin(kylin1上操作)2.1 下载解压2.2 修改conf/kylin.properties2.3 下载Mysql驱动包和创建Mysql数据库2.4 hive-site.xml复制到spark的conf目录2.5 配置环境变量(两台kylin服务器)2.6 kylin运行环境检查2.7 ConfigurationException问题(没有则忽略)2.8 …

神经网络--从0开始搭建全连接网络和CNN网络

前言&#xff1a; Hello大家好&#xff0c;我是Dream。 今天来学习一下如何从0开始搭建全连接网络和CNN网络&#xff0c;并通过实验简单对比一下两种神经网络的不同之处&#xff0c;本文目录较长&#xff0c;可以根据需要自动选取要看的内容~ 本文目录&#xff1a;一、搭建4层全…

Spark核心RDD详解(设计与运行原理,分区,创建,转换,行动与持久化)

RDD设计背景与概念 在实际应用中&#xff0c;存在许多迭代式算法&#xff08;比如机器学习、图算法等&#xff09;和交互式数据挖掘工具&#xff0c;这些应用场景的共同之处是&#xff0c;不同计算阶段之间会重用中间结果&#xff0c;即一个阶段的输出结果会作为下一个阶段的输…

go: GOPATH entry is relative; must be absolute path: “F:oocode“.

系列文章目录 文章目录系列文章目录前言一、可以先查看一下啊二、gopath和goroot变量要和设置的一致总结前言 在安装hertz 之类的 总会弹出go 的不合法 等 出现这样的错误 要不就是go的不合法 会爆红 说go无这种命令 go&#xff1a;术语“ go”未被识别为cmdlet&#xff0c;函…

Hystrix断路器

目录 一、概述 &#xff08;一&#xff09;分布式系统面临的问题 &#xff08;二&#xff09;Hystrix是什么 &#xff08;三&#xff09;能干吗 &#xff08;四&#xff09;官网 &#xff08;五&#xff09;Hystrix官宣&#xff0c;停更进维 二、Hystrix重要概念 &…

JAVA开发(springBoot之HikariDataSource)

HikariDataSource是springBoot自带的数据源管理工具。应该是有zaxxer公司提供贡献给spring社区的。它是一款优秀的数据库连接池工具&#xff08;新的东西一般会吹吹牛&#xff09;&#xff0c;号称 Java WEB 当前速度最快的数据源&#xff0c;相比于传统的 C3P0 、DBCP、Tomcat…

【数据结构】认识顺序表

目录 1、先来认识一下线性表 1.1、对非空的线性表或者线性结构的特点&#xff1a; 1.2、线性表的实现方式 2、顺序表 2.1、定义一个类&#xff0c;实现顺序表 2.2、顺序表的操作方法 2.2.1、打印顺序表&#xff08;display&#xff09; 2.2.2、获取顺序表的长度&#x…

Rancher 中使用 Longhorn 备份恢复数据卷

全文目录导航0. 前言1. NFS 安装配置1.1 安装 nfs 及 rpcbind1.2 创建共享目录1.3 配置访问权限1.4 限制 showmount -e 防止漏洞扫描1.5 防火墙配置2. Longhorn 备份配置2.1 在 Longhorn UI 中配置3. 数据卷备份恢复操作3.1 创建示例工作负载3.2 创建测试数据3.3 创建数据卷备份…

车载以太网 - SomeIP测试专栏 - SomeIP Header - 03

前面已经简单的介绍了整帧SomeIP报文的组成部分,由于Ethernet报文头都是通用的,因此不会做详细的介绍,当然后面在介绍TC8中的TCP、UDP、IPv4、IPv6的时候也会做简单的介绍。不过在这里就不做介绍了,我们直接介绍SomeIP。 SomeIP Header 一、Message ID Message ID是由Serv…

Web3中文|构建Web3融资交易:股权和内部代币分配的比例

2017年&#xff0c;首次币发行&#xff08;ICO&#xff0c;Initial Coin Offering&#xff0c;也称首次代币发售、区块链众筹&#xff0c;是用区块链把使用权和加密货币合二为一&#xff0c;来为开发、维护、交换相关产品或者服务的项目进行融资的方式&#xff09;的融资方式激…