4、指针与数组

数组与指针

  • 指针与地址
  • 指针与函数参数
  • 指针与数组
  • 地址算数运算
  • 字符指针与函数
  • 指针数组以及指向指针的指针
  • 多维数组
  • 命令行参数
  • 指向函数的指针
  • 复杂声明

指针是一种保存变量地址的变量。C语言中,指针的使用非常广泛,原因之一是,指针常常是表达某个计算的惟一途径,另一个原因是,同其它方法比较起来,使用指针通常可以生成更高效、更紧凑的代码。

指针与地址

  • 指针是能够存放一个地址的一组存储单元(通常是两个或4个字节)。如图c的类型是char,并且p是指向c的指针。
    在这里插入图片描述
  • 取地址符&
    地址运算符&只能应用于内存中的对象,即变量与数组元素。它不能作用于表达式、常量或register类型的变量。
p = &c;  //将把c的地址赋值给变量p,我们称p为“指向”c的指针
  • 间接寻址或间接引用运算符*
    当它作用于指针时,将访问指针所指向的对象。
int x = 1, y = 2, z[10];
int *ip;  //ip是指向int类型的指针
ip = &x;  //ip现在指向x
y = *ip;  //y值现在为1
*ip = 0;  //x值现在为0
ip = &z[0]; //ip现在指向z[0]

(*ip)++,中的圆括号是必需的,否则,该表达式将对ip进行加1 运算,而不是对ip指向的对象进行加1运算。
指针也是变量,所以在程序中可以直接使用,而不必通过间接引用的方法使用。

指针与函数参数

指针参数使得被调用函数能够访问和修改主调函数中对象的值。(针对变量名称,其为指针还是类型?)

void swap(int *px, int *py)
{
	int temp;
	temp = *px;
	*px = *py;
	*py = temp;
}

指针与数组

在 C 语言中,指针和数组之间的关系十分密切,因此,在接下来的部分中,我们将同时讨论指针与数组。通过数组下标所能完成的任何操作都可以通过指针来实现。一般来说,用指针编写的程序比用数组下标编写的程序执行速度快,但另一方面,用指针实现的程序理解起来稍微困难一些。
数组声明:

int a[10];

存储形式:
在这里插入图片描述

int *pa;
pa = &a[0];  //pa指向数组a的第0个元素,pa的值为a[0]的地址

在这里插入图片描述
在这里插入图片描述
数组名代表该数组最开始的一个元素的地址。

pa = &a[0];
pa = a;

a[i]等同于*(a+i),在计算数组元素a[i]的值时,C 语言实际上先将其转换为*(a+i)的形式,然后再进行求值。简而言之,一个通过数组和下标实现的表达式可等价地通过指针和偏移量实现。
数组名和指针之间有一个不同之处,指针是一个变量,因此,在C语言中,语句pa=a和pa++都是合法的。但数组名不是变量,因此,类似于a=pa和a++形式的语句是非法的。但是在函数参数中,相当于将数组的第一个地址赋予了函数的形参,并非是数组名的自增,所以是可以传递数组名的。

  • 函数定义中,形式参数char a[]和char *s是等价的。

地址算数运算

  • c语言中的地址算术运算方法是一致且有规律的,将指针、数组和地址的算术运算集成在
    一起是该语言的一大优点。
  • 指针与整数之间不能相互转换,但0是惟一的例外:常量0可以赋值给指针,指针也可以和常量0进行比较。程序中经常用符号常量NULL代替常量0,这样便于更清晰地说明常量0是指针的一个特殊值。。符号常量NULL定义在标准头文件<stddef.h>中。
  • 指针p和q指向同一个数组的成员,那么它们之间就可以进行类似于==、!=、<、>==的关系比较运算。
  • 地址计算时是以字节为基本单元来运算的,比如char数组计算时,下一个字符提取可以直接地址加1.但是如果是int型,则需要地址+4才能转换到下一个int整数。前提是定义该指针为char型。
  • 指针的算术运算具有一致性:如果处理的数据类型是比字符型占据更多存储空间的浮点类型,并且p是一个指向浮点类型的指针,那么在执行p++后,p将指向下一个浮点数的地址。
    有效的指针运算包括相同类型指针之间的赋值运算;指针同整数之间的加法或减法运算;
    指向相同数组中元素的两个指针间的减法或比较运算;将指针赋值为0或指针与0之间的比较运算

字符指针与函数

字符串常量是一个字符数组。

”I am a string“

字符串常量占据的存储单元数也因此比双引号内的字符数大1。

  • 字符串常量使用
printf("Hello, world\n");
char *pmessage;
pmessage = "now is the time";  //都是指针使用
  • 字符数组与字符指针
char amessage[] = "nw is the time"; /* 定义一个数组*/
char *pmessage = "now is the time"; /* 定义一个指针*/

在这里插入图片描述

  • 复制字符串程序
void strcpy(char *s, char *t)  //将t拷贝到s中
{
	while (*s++ = *t++)
;
}
  • 进栈和出栈操作
*p++ = val;  //将val压入栈
val = *--p;  //将栈顶元素弹出到val中

指针数组以及指向指针的指针

由于指针本身也是变量,所以它们也可以像其它变量一样存储在数组中。

char *lineptr[MAXLINES];
  • 初始化
    指针数组的初始化语法和前面所讲的其它类型对象的初始化语法类似。
static char *name[] = {
	"Illegal month",
	"January", "February", "March",
	"April", "May", "June",
	"July", "August", "September",
	"October", "November", "December"
};

多维数组

C语言提供了类似于矩阵的多维数组,但实际上它们并不像指针数组使用得那样广泛。

static char daytab[2][13] = {
	{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
	{0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
};
  • 区别
	f(int (*daytab)[13]); //二维数组,表明参数是一个指针,它指向具有13个整型元素的一维数组
	int *daytab[13];   //一维指针数组
  • 指针与多维数组
	int a[10][20];
	int *b[10];

指针数组的一个重要优点在于,数组的每一行长度可以不同。而多维数组可以理解为每行固定长度的指针。

命令行参数

在支持C 语言的环境中,可以在程序开始执行时将命令行参数传递给程序。调用主函数main 时,它带有两个参数。第一个参数(习惯上称为argc,用于参数计数)的值表示运行程序时命令行中参数的数目;第二个参数(称为argv,用于参数向量)是一个指向字符串数组的指针,其中每个字符串对应一个参数。我们通常用多级指针处理这些字符串。
在这里插入图片描述
C语言程序有一个公共的约定:以负号开头的参数表示一个可选标志或参数。
在系统中调用运行的程序:

find -x -n
find -xn   // 组合使用

指向函数的指针

在 C 语言中,函数本身不是变量,但可以定义指向函数的指针。

int (*comp)(void *, void *);  //函数指针
int *comp(void *, void *); //返回指针的函数

复杂声明

int *f();  //f是一个函数,它返回一个指向int类型的指针
int (*pf)();   //pf:是一个指向函数的指针,该函数返回一个int类型的对象

如何创建复杂声明?

  1. 使用typedef通过简单的步骤合成;
  2. 采用函数将正确的C语言声明转换为文字描述。

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

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

相关文章

HTML音乐播放器带歌词跟随效果源码附注释

音乐播放器效果截图 <!doctype html><!--声明html版本编写指令 H5--> <html><head><!--声明页面编码 uft-8 国际编码--><meta charset

x-cmd pkg | ctop - 针对容器的类 top 命令

目录 介绍首次用户功能特点类似工具与竞品进一步阅读 介绍 ctop 是一个基于容器的类似 top 命令的性能监控工具&#xff0c;采用 Go 语言编写的&#xff0c;它以类似于 top 命令的方式显示运行中的容器的资源使用情况。ctop 提供了一个交互式的界面&#xff0c;可以让用户实时…

基于python热门旅游景点推荐系统+爬虫技术

大数据分析&#xff0c;数据可视化等皆可用。 源码分享。

虚幻UE 材质-纹理 1

本篇笔记主要讲两个纹理内的内容&#xff1a;渲染目标和媒体纹理 媒体纹理可以参考之前的笔记&#xff1a;虚幻UE 媒体播放器-视频转成材质-播放视频 所以本篇主要讲两个组件&#xff1a;场景捕获2D、场景捕获立方体 两个纹理&#xff1a;渲染目标、立方体渲染目标 三个功能&am…

C++ continue语句

作用&#xff1a;在循环语句中&#xff0c;跳过本次循环中余下尚未执行的语句&#xff0c;继续执行下一次循环 与break的区别在于&#xff0c;如果把上述continue换位break&#xff0c;则该程序执行到break则会直接退出for循环&#xff0c;不再执行后面的代码和以后的循环。 实…

如何使用web文件管理器Net2FTP搭建个人网盘

文章目录 1.前言2. Net2FTP网站搭建2.1. Net2FTP下载和安装2.2. Net2FTP网页测试 3. cpolar内网穿透3.1.Cpolar云端设置3.2.Cpolar本地设置 4.公网访问测试5.结语 1.前言 文件传输可以说是互联网最主要的应用之一&#xff0c;特别是智能设备的大面积使用&#xff0c;无论是个人…

Python办公自动化 – 操作NoSQL数据库和自动化图像识别

Python办公自动化 – 操作NoSQL数据库和自动化图像识别 以下是往期的文章目录&#xff0c;需要可以查看哦。 Python办公自动化 – Excel和Word的操作运用 Python办公自动化 – Python发送电子邮件和Outlook的集成 Python办公自动化 – 对PDF文档和PPT文档的处理 Python办公自动…

HubSpot CRM:卓越客户服务的关键引擎

在数字化时代&#xff0c;提供卓越的客户服务是企业成功的关键之一。HubSpot CRM以其强大的功能和灵活性&#xff0c;成为实现卓越客户服务的关键引擎&#xff0c;以下是强调HubSpot CRM在客户服务中的应用的关键方面&#xff1a; 1. 全面的客户视图 HubSpot CRM集成了全面的…

实战Python快速排序:深入学习算法步骤

概要 快速排序是一种常用的排序算法&#xff0c;它通过分治的思想将一个大问题拆分成多个小问题&#xff0c;并逐步解决这些小问题&#xff0c;最终完成排序。本文将深入讨论快速排序的算法原理和Python实现。 快速排序算法原理 快速排序的基本思想是选取一个基准元素&#x…

scrollTop与offsetTop解决小分辨率区域块向上滚动效果效果,结合animation与@keyframes实现标题左右闪动更换颜色效果。

scrollTop 是一个属性&#xff0c;它表示元素的滚动内容垂直滚动条的位置。对于可滚动元素&#xff0c;scrollTop 属性返回垂直滚动条滚动的像素数&#xff0c;即元素顶部被隐藏的像素数。 offsetTop 是一个属性&#xff0c;用于获取一个元素相对于其父元素的垂直偏移量&…

c++ oatpp api服务端取get参数,post内容

最近用oatpp做接口,部分功能已经上线,比较简单 1,取post json 如上图 post application/json 格式 首先定义post路由路径 router->route("POST", "/Getxxx", std::make_shared<Handler_Getxxx>()); 然后我们完成Handler_Getxxx 函数,…

怎么用ATECLOUD-POWER开关电源测试系统测量交直流电源功率?

直流电源功率和交流电源功率 电源功率是用来描述电源输出能力的指标&#xff0c;电源功率的大小直接关系到电子设备的性能和功能。电源功率越大&#xff0c;提供的电能就越多&#xff0c;从而也可以适用于大功率电子设备的运行。 电源功率包括直流电源功率和交流电源功率。 1. …

【Python】使用tkinter设计开发Windows桌面程序记事本(1)

下一篇&#xff1a; 记事本介绍 电脑记事本是一种简单的文本编辑器&#xff0c;用于在电脑上创建、编辑和存储文本文件。它通常被用作轻量级的文本编辑工具&#xff0c;适用于简单的文本编辑任务&#xff0c;如写日记、做笔记、编写代码等。以下是对电脑记事本的详细介绍&…

【LLM 论文阅读】NEFTU N E: LLM微调的免费午餐

指令微调的局限性 指令微调对于训练llm的能力至关重要&#xff0c;而模型的有用性在很大程度上取决于我们从小指令数据集中获得最大信息的能力。在本文中&#xff0c;我们提出在微调正向传递的过程中&#xff0c;在训练数据的嵌入向量中添加随机噪声&#xff0c;论文实验显示这…

k8s的存储卷

存储卷------数据卷 把容器内的目录&#xff0c;和宿主机的目录进行挂载。 容器在系统上的生命周期是短暂的&#xff0c;delete&#xff0c;k8s用控制&#xff08;deployment&#xff09;创建的pod&#xff0c;delete相当于重启&#xff0c;容器的状态也会回复到初始状态。 …

中国京津冀光伏展

京津冀在中国光伏展是中国光伏行业的一次重要展览活动&#xff0c;旨在推动京津冀地区光伏产业的发展和合作&#xff0c;促进全国光伏产业的健康发展。 京津冀地区是中国光伏产业的重要基地之一&#xff0c;拥有丰富的太阳能资源和发展潜力。中国光伏展作为光伏行业的盛会&…

firewall防火墙(二)

一、IP伪装与端口转发&#xff1a; 当用户数据包经过NAT设备时&#xff0e;NAT设备将源地址替换为公网P地址&#xff0e;而返回的数据包就可以被路由&#xff0c;NAT技术一般都是在企业边界路由器或者防火墙上来配置. Firewaild支持两种类型的NAT;P地址伪装和端口转发. 1.1 I…

优化 ParamValidator,让编辑器Pycharm智能提示校验方法

目录 一、前置说明1、总体目录2、相关回顾3、本节目标 二、操作步骤1、项目目录2、代码实现3、测试代码4、日志输出 三、后置说明1、要点小结2、下节准备 一、前置说明 1、总体目录 《 pyparamvalidate 参数校验器&#xff0c;从编码到发布全过程》 2、相关回顾 基于 Valid…

鱼哥赠书活动第⑥期:《内网渗透实战攻略》看完这本书教你玩转内网渗透测试成为实战高手!!!!

鱼哥赠书活动第⑥期&#xff1a;《内网渗透实战攻略》 如何阅读本书&#xff1a;本书章节介绍&#xff1a;本书大致目录&#xff1a;适合阅读对象&#xff1a;赠书抽奖规则:往期赠书福利&#xff1a; 当今&#xff0c;网络系统面临着越来越严峻的安全挑战。在众多的安全挑战中&…

产品使用说明书也能进行SEO?要怎么制作才能使其易于搜索?

产品使用说明书也能进行SEO&#xff1f;是的&#xff0c;你没有听错&#xff0c;不过是在线化的产品使用说明书。产品使用说明书能通过特定的策略和技巧进行搜索引擎优化&#xff08;SEO&#xff09;。这不只是为了让产品信息更易被找到&#xff0c;更是为了提升品牌知名度和用…