4、C语言:指针与数组

数组与指针

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

指针是一种保存变量地址的变量。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/323481.html

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

相关文章

紫光展锐T610安卓核心板_虎贲T610安卓核心板参数

紫光展锐T610核心板是一款结构紧凑的4G智能模块&#xff0c;尺寸为52.5nm*38.5nm*2.9nm&#xff0c;适用于对产品结构尺寸要求较高的场合。该核心板搭载Android 11操作系统&#xff0c;采用12nm制程工艺&#xff0c;配备八核1.8GHz的CPU&#xff0c;包括2 x A751.8GHz 6 x A55…

20240115在ubuntu20.04.6下查看显卡信息

20240115在ubuntu20.04.6下查看显卡信息 2024/1/15 17:33 百度&#xff1a;ubuntu查看显卡型号命令 https://linux.xiaosiseo.com/post/6037.html#id4 Ubuntu查看显卡信息命令 小四LINUX7个月前 (05-22)Ubuntu3230 小四LINUX&#xff0c;是小四运营旗下网站&#xff0c;专注LIN…

excel管理接口测试用例

闲话休扯&#xff0c;上需求&#xff1a;自动读取、执行excel里面的接口测试用例&#xff0c;测试完成后&#xff0c;返回错误结果并发送邮件通知。 分析&#xff1a; 1、设计excel表格 2、读取excel表格 3、拼接url&#xff0c;发送请求 4、汇总错误结果、发送邮件 开始实现…

短视频IP运营流程架构SOP模板PPT

【干货资料持续更新&#xff0c;以防走丢】 短视频IP运营流程架构SOP模板PPT 部分资料预览 资料部分是网络整理&#xff0c;仅供学习参考。 抖音运营资料合集&#xff08;完整资料包含以下内容&#xff09; 目录 抖音15秒短视频剧本创作公式 在抖音这个短视频平台上&#…

QT报错记录

Ubuntu22.04安装Qt之后启动Qt Creator报错&#xff1a; Fron 6.5.0, xcb-cursor0 or libxcb-cursor0 is needed to load the Qt xcb platforn plugin. Could not load. This application failed to start because no Qt platforn plugin could be initialized. Reinstalling t…

OpenCV-Python(41):背景减除

目标 学习并掌握OpenCV中的背景减除方法 背景说明 在很多基础应用中背景检出都是一个非常重要的步骤。例如&#xff1a;顾客统计&#xff0c;使用一个静态摄像头来记录进入和离开房间的人数&#xff0c;或者是交通摄像头&#xff0c;需要提取交通工具的信息等。在所有的这些例…

QT day6

目录 思维导图 学生管理系统 思维导图 学生管理系统 ui界面 头文件 #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QSqlDatabase> //数据库管理类 #include <QSqlQuery> //执行sql语句类 #include <QSqlRecord> //数据库记录类 …

【大模型 + 网络安全 】炒作内卷 or 革新升级?

一年前&#xff0c;ChatGPT问世&#xff0c;以强大的信息整合推理和语言对话能力惊艳全球&#xff0c;随后&#xff0c;以大语言模型LLM&#xff08;以下简称“大模型”&#xff09;为代表的AI技术应用全面席卷&#xff0c;赋能千行百业&#xff0c;重构业务流程&#xff0c;加…

Qt点击按钮在其附近弹出一个窗口

效果 FS_PopupWidget.h #ifndef FS_POPUPWIDGET_H #define FS_POPUPWIDGET_H#pragma once#include <QToolButton> #include <QWidgetAction> #include <QPointer>class QMenu;class FS_PopupWidget : public QToolButton {Q_OBJECTpublic:FS_PopupWidget(QW…

Android的setContentView流程

一.Activity里面的mWindow是啥 在ActivityThread的performLaunchActivity方法里面&#xff1a; private Activity performLaunchActivity(ActivityClientRecord r, Intent customIntent) {ActivityInfo aInfo r.activityInfo;if (r.packageInfo null) {r.packageInfo getP…

2024年甘肃省职业院校技能大赛信息安全管理与评估 样题一 模块二

竞赛需要完成三个阶段的任务&#xff0c;分别完成三个模块&#xff0c;总分共计 1000分。三个模块内容和分值分别是&#xff1a; 1.第一阶段&#xff1a;模块一 网络平台搭建与设备安全防护&#xff08;180 分钟&#xff0c;300 分&#xff09;。 2.第二阶段&#xff1a;模块二…

如何分析测试任务及需求(附分析流程)

测试分析 确认测试范围 根据测试项目的不同需求&#xff0c;有大致几类测试项目类型&#xff1a;商户/平台功能测试、支付方式接入测试、架构调整类测试、后台优化测试、性能测试、基本功能自动化测试。 测试项目需要按照文档要求进行测试需求分析&#xff0c;并给出对应的输出…

数据结构学习 jz66 构建乘积数组

关键词&#xff1a;数学 双指针 方法一&#xff1a;这个题目我一开始做不知道不能用除法。我做的&#xff1a;[ 用时: 12 m 12 s ] 用了除法 分类讨论 方法二&#xff1a;后来看了提示&#xff0c;双指针&#xff0c;两边各开始乘。 方法三&#xff1a;然后又看了答案可以节…

几款提高开发效率的Idea 插件

1、ignore 开发代码过程中经常会有一些需要提交到代码仓库的文件&#xff0c;比如java文件生成的.class、.jar 等&#xff0c;如果将编译后的文件都提交到代码库那么代码库会很大&#xff0c;关键是没有必要。 这款插件就可以很方便的解决某类文件或者某个文件夹不需要提交到…

OS进程管理

进程 文章目录 进程概念组成特征状态与转换组织方式链接方式索引方式 进程控制实现进程控制如何实现原语的“原子性” 进程通信(IPC)共享存储基于存储区共享基于数据结构的共享 消息传递直接通信方式间接通信方式 管道通信 线程实现方式用户级线程内核级线程 多线程模式状态与转…

文件销毁的方法与安全操作守则, 淼一护航文件安全最后一公里

文件销毁的目前大概分为三种&#xff0c;分别是&#xff1a; 一、做成纸浆填埋。把需要销毁处理的过期涉密文件放到工业浸泡池里面浸泡&#xff0c;放入自来水和一定比例的化学药物&#xff0c;文件经过5-8个小时的浸泡后变成了纸浆&#xff0c;上面记录的信息也随之被销毁。最…

智慧公厕:城市公共厕所环境卫生管理的智慧引擎

公共厕所是城市重要的环卫基础设施&#xff0c;也是城市建设不可或缺的组成部分。其整洁度、方便性和管理精细化&#xff0c;直接体现了城市管理水平和文明程度。为了满足越来越高的城市管理要求&#xff0c;智慧公厕应运而生。借助物联网技术、传感感知技术、云计算和大数据等…

2023年全球软件开发大会(QCon北京站2023)9月:核心内容与学习收获(附大会核心PPT下载)

随着科技的飞速发展&#xff0c;全球软件开发大会&#xff08;QCon&#xff09;作为行业领先的技术盛会&#xff0c;为世界各地的专业人士提供了交流与学习的平台。本次大会汇集了全球的软件开发者、架构师、项目经理等&#xff0c;共同探讨软件开发的最新趋势、技术与实践。本…

图书管理系统:从数据库设计到前端展示的实战经验分享

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

汽车线束的汽配企业MES管理系统解决方案

随着科技的飞速发展和环保需求的日益提升&#xff0c;新能源汽车在全球范围内崭露头角&#xff0c;成为未来出行的主导力量。在这股浪潮中&#xff0c;中国凭借其强大的研发实力和市场敏锐度&#xff0c;迅速崛起为新能源汽车领域的佼佼者。而作为汽车数字化控制与智能化应用的…