C语言之指针和数组

指针和数组虽然是不同的东西,但却有着千丝万缕的关系,下面就让我们逐一了解吧!

指针和数组

数组名原则上会被解释为指向该数组起始元素的指针

也就是说。如果a是数组,那么表达式a的值就是a[0]的值,即与&a[0]一致;如果数组a的元素类型为Type型,那么不管有多少个元素,表达式a的类型都为Type*型。

将数组名视为指针,也催生出了数组与指针的密切关系,我们看下图:

这里声明了数组a和指针p,指针p的初始值是a,又因为数组名a会被解释为&a[0],所以存入p的值为&a[0],也就是说指针p会被初始化为指向数组起始元素的a[0],指针p指向的起始元素,不是数组中的全部元素。

围绕着指向数组元素的指针,有以下规则成立:

指针p指向数组的元素e时:

1.p+i为指向元素e后的第i个元素
2.p-i为指向元素e前的第i个元素

 数组名在什么情况下不会被视为指向起始元素的指针

█作为sizeof运算符的操作数出现时

sizeof(数组名)不会生成指向起始元素的指针的长度,而是生成数组的整体长度

█作为取地址运算符&的操作数出现时

&+数组名不是指向起始元素的指针的指针,而是指向数组整体得指针


也就是说,指向各元素的指针p+i和&a[i]是等价的,其中&a[i]是指向元素a[i]的指针,其值是a[i]的地址

我们用一个代码来显示出它们各自的值:

#include<stdio.h>

int main()
{
	int i = 0;
	int a[5] = {1,2,3,4,5};
	int *p = a;
	
	for(;i<5;i++)
		printf("&a[%d] = %p   p+%d = %p\n", i, &a[i], i, p + i);
	
	return 0;
}

指针运算符和下表运算符

如果在指向数组内元素的指针p+i前写上指针运算符*,会变成什么情况呢?

*(p+i)就是该元素的别名,因此如果p指向a[0],那么表达式*(p+i)就表示a[i]的本身

指针p指向数组的元素e时:

指向元素e后第i个元素*(p+i),可以写为p[i]

指向元素e前第i的元素*(p-i),可以写为p[-i]

 我们来看下它们之间的关系:

  • 因为p+2指向a[2],所以*(p+2)是a[2]的别名(组c)
  • 因为*(p+2)可以写为a[2],所以p[2]也是a[2]的别名(组B)

以下4个表达式都是访问各元素的表达式:

a[i]

*(a+i)

p[i]

*(p+i)

一下4个表达式都是指向各元素的指针:

&a[i]

a+i

&p[i]

p+i

注意

Type*型指针p指向Type型数组a的起始元素a[0]时,指针p的行为就和数组a本身一样

表达式a[i]和p+i中的i,表示位于指针a和p所指的元素后第几个元素的位置,所以数组起始元素的下标必须是0

数组和指针的不同点

int *p;
int y[5];
p = y;

p是指向int型变量的指针,被赋给p的是y,即&y[0],赋值后,指针p指向y[0]

int a[5];
int b[5];
a = b;

指向a=b时会出现编译错误,虽然说a会被解释为指向数组起始元素的指针,但不可以改写其值

如果可以这样赋值,那么数组的地址就会被改变,变为别的地址,因此,赋值表达式的左操作数不可是数组名。

下标运算符的操作数

我们看下指针p和整数i相加的式子前写上指针运算符的表达式*(p+i),括号内的进行的是加法运算,与算数类型的数值间的加法运算等同,也就是*(i+p)

这样一来,访问数组元素的表达式p[i]也可以写成i[p],下表运算符[ ],是具有两个操作数的双目运算符,其中一个操作数的类型是:

指向Type型对象的指针

另一个操作数的类型是:

整数类型数据类型

下标运算符[ ]的操作数的顺序是随意的,例如a[3]也可以写为3[a]

下表运算符[ ]所生成值的类型是:Type型

但是在进行书写时,这种格式虽然没有错误,但还是尽量不要这样写

数组的传递

#include<stdio.h>

/*将数组v开头的n个元素赋值给val*/
void ary_set(int v[], int n, int val)
{
	int i = 0;
	for(; i < n; i++)
		v[i] = val;
}
int main()
{
	int i = 0;
	int a[] = {1,2,3,4,5};
	
	ary_set(a, 5, 99);
	
	for(;i < 5; i++)
		printf("a[%d] = %d\n", i, a[i]);
	
	return 0;
}

对于ary_set函数中数组v的声明可以写为一下几种形式:

a和b都可以解释为c,也就是说形参v的类型不是数组而是指针,即使像b中那样声明元素的个数,也是无用的。

但是我们可以在传递数组时,将数组元素个数作为别的参数来处理。

在调用ary_set函数时,,int*型的形参v将使用实参a,即&a[0]进行初始化,由于指针v指向数组的起始元素a[0],因此在ary_set函数内指针v的行为就像数组本身一样

如果改写所接受的元素的值,结果就会反映到调用方的数组元素上。

注意

函数间数组的传递是以指向第一元素的指针的形式进行的,在被调用的函数中作为指针接收的数组,实际上就是调用方传递的数组。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TikTok真题第9天 | 163.缺失的区间、1861.旋转箱子、2217.找到指定长度的回文数

163.缺失的区间 题目链接&#xff1a;163.missing-ranges 解法&#xff1a; 基本逻辑是&#xff0c;依次遍历nums中的所有的元素&#xff0c;判断这个元素&#xff08;right&#xff09;和上一个元素&#xff08;left&#xff09;的差值是否>2&#xff0c;如果是&#xf…

Cisco模拟器-跨交换机实现VLAN

计要求将两台相互连接的交换机上的VLAN号全局使用&#xff0c;技术上可以使用TRUNK技术的数据包标记功能来实现。 通过设计&#xff0c;可以对多台交换机进行整合&#xff0c;提高网络设备的利用率、降低网络工程的成本&#xff0c;同时也可以简化网络配置。 交换机0配置&…

【privateGPT】使用privateGPT训练您自己的LLM

了解如何在不向提供商公开您的私人数据的情况下训练您自己的语言模型 使用OpenAI的ChatGPT等公共人工智能服务的主要担忧之一是将您的私人数据暴露给提供商的风险。对于商业用途&#xff0c;这仍然是考虑采用人工智能技术的公司最大的担忧。 很多时候&#xff0c;你想创建自己…

.FileZilla的使用和主动模式被动模式介绍

FileZilla的使用和主动模式被动模式介绍 1.FileZilla的使用和主动模式被动模式介绍1.安装下载2.新建组和用户2.1打开后出现如下界面2.2点击编辑打开组这个选项2.3点击添加组以后&#xff0c;点击确认2.4输入组的名称&#xff0c;列如我输入的niyin2.5点击用户选项2.6像上面一样…

Winform RDLC报表(数据库连接、报表函数使用、动态表头)

文章目录 NuGet安装库数据库连接报表设计报表引用添加报表 数据集设计方法一手动添加方法二——连接数据库添加 关联报表与数据集表格数据与数据集数据设计表格格式、字体设计报表数据字段绑定 Winform 使用报表控件数据库填充数据集从数据库获取与数据源相同字段的数据 动态表…

关于求定积分的反函数的导数【认清原函数x变量和反函数x变量】

如图碰到该题该怎么解&#xff1f; 在纸上按①②③的顺序写出这个&#xff0c;其中①是最主要的 第②步和第③步就是在用反函数时要用到的逻辑思维&#xff0c;不是一起用的&#xff0c;你需要用②才去用②&#xff0c;你需要用③才去用③ 在纸上先写出第①步&#xff0c;即 其…

【Linux操作系统】探秘Linux奥秘:操作系统的入门与实战

&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《操作系统实验室》&#x1f516;诗赋清音&#xff1a;柳垂轻絮拂人衣&#xff0c;心随风舞梦飞。 山川湖海皆可涉&#xff0c;勇者征途逐星辉。 目录 &#x1fa90;1 初识Linux OS …

css实现一个斑马条纹动画,实现一个理发店门口的小转转,进度条动画同理!

css实现一个斑马条纹动画&#xff0c;实现一个理发店门口的小转转 前置基础知识 css背景background的重复渐变属性repeating-linear-gradient() 该属性类似于linear-gradient(),但他会在整个方向上重复渐变以覆盖整个容器 一、先写一个普通渐变例子linear-gradient() &…

leetcode贪心算法题总结(三)

本章目录 1.合并区间2.无重叠区间3.用最少数量的箭引爆气球4.整数替换5.俄罗斯套娃信封问题6.可被三整除的最大和7.距离相等的条形码8.重构字符串 1.合并区间 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>&…

ZigBee案例笔记 - 无线点灯

文章目录 无线点灯实验概述工程关键字工程文件夹介绍Basic RF软件设计框图简单说明工程操作Basic RF启动流程Basic RF发送流程Basic RF接收流程 无线点灯案例无线点灯现象 无线点灯实验概述 ZigBee无线点灯实验&#xff08;即Basic RF工程&#xff09;&#xff0c;由TI公司提供…

第一讲:BeanFactory和ApplicationContext

BeanFactory和ApplicationContext 什么是BeanFactory 它是ApplicationContext的父接口它才是Spring的核心容器&#xff0c;主要的ApplicationContext实现都组合了它的功能 BeanFactory能做什么? 表面上看BeanFactory的主要方法只有getBean()&#xff0c;实际上控制反转、基…

Spring-5-切入点的高级使用

Spring提供了两个额外的Pointcut实现&#xff0c;分别是ComposablePointcut和ControlFlowPointcut,它们提供了所需的灵活性。 使用控制流切入点 由ControlFlowPointcut类实现的Spring控制流切入点类似于许多其他AOP实现中可用的cflow构造&#xff0c;尽管功能上没有那么强大。…

(self-supervised learning)Event Camera Data Pre-training

Publisher: ICCV 2023 MOTIVATION OF READING: 自监督学习、稀疏事件 NILM link: https://arxiv.org/pdf/2301.01928.pdf Code: GitHub - Yan98/Event-Camera-Data-Pre-training 1. Overview Contributions are summarized as follows: 1. A self-supervised framework f…

“产品经理必懂的关键术语“

产品经理是现代企业中非常重要的一个角色&#xff0c;他们负责制定产品策略、规划产品开发流程、管理产品质量和用户反馈等等。然而&#xff0c;对于产品经理来说&#xff0c;了解并掌握相关的专业术语是非常重要的。本篇文章会介绍一些产品经理需要掌握的专业术语&#xff0c;…

一篇文章掌握系统架构的演变和常见微服务框架

目录 前言 一、系统架构的演变 1、单体应用架构 优点&#xff1a; 缺点&#xff1a; 2、垂直应用架构 优点&#xff1a; 缺点&#xff1a; 3、分布式SOA架构 3.1 什么是SOA 3.2 SOA架构 优点&#xff1a; 缺点&#xff1a; 4、微服务架构 优点&#xff1a; 缺点…

eve环境虚拟机和电脑如何传送文件

一.桥接 &#xff08;实现电脑和虚拟机在同一网段&#xff09; 虚拟机上网盘设置 二.属性---文件共享设置 1打开属性&#xff0c;点击共享 2.添加共享人为全部人&#xff0c;并修改权限为读写模式 3.点击高级共享&#xff0c;选定此文件夹 4.点击网络和共享中心&#xff0c;划…

C++——智能指针和RAII

该文章代码均在gitee中开源 C智能指针hpphttps://gitee.com/Ehundred/cpp-knowledge-points/tree/master/%E6%99%BA%E8%83%BD%E6%8C%87%E9%92%88​​​​​​​ 智能指针 传统指针的问题 在C自定义类型中&#xff0c;我们为了避免内存泄漏&#xff0c;会采用析构函数的方法释…

2023年末,软件测试面试题总结与分享

大家好&#xff0c;最近有不少小伙伴在后台留言&#xff0c;得准备年后面试了&#xff0c;又不知道从何下手&#xff01;为了帮大家节约时间&#xff0c;特意准备了一份面试相关的资料&#xff0c;内容非常的全面&#xff0c;真的可以好好补一补&#xff0c;希望大家在都能拿到…

分享Python采集40个NET整站程序源码,总有一款适合您

分享Python采集40个NET整站程序源码&#xff0c;总有一款适合您 Python采集的40个NET整站程序源码下载链接&#xff1a;https://pan.baidu.com/s/1z54JHJkFYa4Kx2oBtPrn_w?pwd2ta4 提取码&#xff1a;2ta4 商品评论网站系统 小孔子内容管理系统XkCms V2.0 友间别墅整站程…

实现二叉树的基本操作与OJ练习

目录 1.二叉树的基本操作 1.1二叉树基本操作完整代码 1.2检测value值是否存在 1.3层序遍历 1.4判断一棵树是不是完全二叉树 2.OJ练习 2.1平衡二叉树 2.2对称二叉树 2.3二叉树遍历 1.二叉树的基本操作 1.1二叉树基本操作完整代码 public class BinaryTree {static…