用指针访问一维数组

2023-11-20


顺序查找

  • 要求用指针实现:在整数集合r中顺序查找与给定值key相等的元素。
  • 用一维整型数组a[n]存储整数集合,顺序查找从数组的第一个元素开始,依次比较每一个元素,直至找到key为止,如果数组的全部元素都比较完,说明查找失败

数组方式实现

#include <stdio.h>
#define N 6
int main()
{
	int a[N] = { 2,4,8,6,5,3 }, i, key, index = 0;
	key = 8;
	for(i=0;i<N;i++)
		if (a[i] == key)
		{
			index = i;
			break;
		}
	if (i == N)
		index = -1;	//没找到
	if (index == -1)
		printf("查找失败!\n");
	else
		printf("查找成功,元素%d在集合中的序号是%d\n", key, index);
	return 0;
}

指针实现方式

#include <stdio.h>
#define N 6
int main()
{
	int a[N] = { 2,4,8,6,5,3 }, i, key, index = 0;
	int* p = a;
	key = 8;
	for (; p < a + N; p++)
		if (*p == key) {
			index = p - a;
			break;
		}
	if (p == a + N)
		index = -1;
	if (index == -1)
		printf("查找失败!\n");
	else
		printf("查找成功,元素%d在集合中的序号是%d\n", key, index);
	return 0;
}

对一位数组元素的访问有三种方式

  • 1、通过下标访问数组元素:
int a[10];
for (int i = 0;i < 10;i++)
    a[i] = i;
  • 2、通过地址访问数组元素
int a[10];
for (int i = 0;i < 10; i++)
    *(a+i) = i;				//a+i是第i个元素
  • 3、通过指针访问数组元素:
int a[10];
int *p=a;
for (int i = 0;i < 10; i++)
    *(p+i)=i;		//*(p+i)可以用p[i]代替

(a+i)和(p+i)是不一样的。a不可以移动,p可以移动用p++ a是保存了数组的首地址,常量指针


p++自增运算要比p+i算术运算快得多,因此其执行效率比地址方式高

int a[10];
int *p = a;
for (int i = 0; p < (a+10); i++,p++)			//表达式3是逗号表达式
    *p=i;

因为数组占用一段连续的内存空间,因此,指针的算术运算通常用于数组。

int num,a[5]={1,2,3,4,5};
int *p=a,*q;				//指针p指向元素a[0]
q=p+4;						//相当于q = p + 4 × sizeof(int), 将q指向a[4]
num=q-p;					//指针q和p之间的元素个数,值为4
num=(int)q-(int)p;			//指针q和p之间的字节数,值为16(这种很少用)

指针变量的关系运算

同类型的指针之间进行比较运算。

不同类型的指针之间、指针与非0整数之间的关系运算没有实际意义。

假设p和q是两个同类型的指针变量,则

  • p == q:判断指针p和q是否指向同一存储单元
  • p > q :指针p所指存储单元在指针q所指存储单元的后面
  • p != NULL :判断指针p是否为空指针

引例

输入10个整数,将其中最小的数与第一个数交换,把最大的数与最后一个数交换。

  • 程序运行结果范例(蓝色字体表示输入):
  • 请输入10个整数:2 3 4 23 5 78 0 1 6 12
  • 交换后的结果为:0 3 4 23 5 12 2 1 5 78
  • 请输入10个整数:1 25 7 40 5 6 12 8 30 19
  • 交换后的结果为:1 25 7 19 5 6 12 8 30 40

用数组即数组传参方式实现上述程序。

写3个函数:(1)输入10个数;(2)进行处理;(3)输出10个数。

这个程序使用数组和指针两种方法实现。

数组实现方式

//一般情况下我们很少直接传一个数组参数,往往要传两个参数,传的是数组,第二个传输组多长
void process(int arr[],int num)
{
    int temp;
    int maxNum = arr[0];
    int minNum = arr[0];
    int maxPos = 0;
    int minPos = 0;
    for (int i=1; i<num; i++)
    {
        if (arr[i] < minNum)
        {
            minNum = arr[i];
            minPos = i;
        }
        if (arr[i] > maxNum)
        {
            maxNum = arr[i];
            maxPos = i;
        }
    }
    //若最小数不是第一个数,将最小数和第一个数交换
    if (minPos != 0)
        swap(&arr[0],&arr[minPos]);
    //若最大数不是最后一个数,最大数和最后的数交换
    if (maxPos != num-1)
    	swap(&arr[num-1],&arr[maxPos]);
}

主函数
int main()
{
    int a[10];
    inputArray(a,10);
    process(a,10);
    outputArray(a,10);
    return 0;
}

指针实现方式

void process(int *arr,int num)
{
    int temp;
    int *p;					//p指针向后移动扫描数组
    int *min,*max;			//min和max指针记录最小和最大数的地址
    p=max=min=arr;			//p,max,min均指向数组第一个数
   	for (; p<arr+num ; p++)
    {
        if (*p<*min)
            min = p;
        if (*p>*max)
            max = p;
    }
    if (min != arr)
    	swap(arr,min);
    if (max != arr+num-1)
        swap((arr+num-1),max);
}

主函数
//调用语句
process(a,10);

一维数组作为函数的参数

一维数组的座位参数的特点是:形参数组和实参数组是同一个数组。

也就是说,主程序和子程序分别同不同的名字,共用了同一块空间。因此在子程序中,通过arr【i】对数组的任何改变,都会相应地影响到对应的实参a【i】


实际应用

描述

一个句子中有多个连续空格,过滤多余空格,只留下一个空格。

输入

一行,一个字符串(长度不超过200),句子的头和尾都没有空格

输出

过滤之后的句子

样例输入:

Hello world.This is c language.

样例输出

Hello world.This is c language.

str1: T h i s i s c l a n g u a g e \0
str2: T h i s i s c l a n g u a g e \0
void operate(char *p1,char *p2)
{
    while (*p1)
    {
        if (*p1!=' ')
        {
            *p2++=*p1++;		//*的优先级要高
        }
        else
        {
            *p2++ = ' ';
            while(*p1 == ' ')
                p1++;
            /*
            也可以写为
            while (*p1++ == ' ')
            	;
            */
        }
    }
    *p2 = '\0';		//把str2初始化为'\0'就不需要写这个了,考虑到会用到其他情况,可能不会初始化,加上这个会很保险
}
int mian()
{
    char str1[201]={0};
    char str2[201]={0};
    gets(str1);
    operate(str1,str2);
    printf("%s",str2);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用指针访问一维数组 的相关文章

  • 从 Invoke 方法获取 RETURN

    我正在尝试从另一个线程上的列表框项目中读取值 我尝试创建一种新方法来运行调用命令 我可以设法将命令发送到列表框 例如通过调用方法添加 但我似乎无法得到响应 我似乎无法获取该项目的值 我尝试了几种方法 一旦我将它从空变为字符串 事情就开始变得
  • OpenGL缓冲区更新[重复]

    这个问题在这里已经有答案了 目前我正在编写一个模拟水的程序 以下是我所做的步骤 创建水面 平面 创建VAO 创建顶点缓冲区对象 在其中存储法线和顶点 将指针绑定到此 VBO 创建索引缓冲区对象 然后我使用 glDrawElements 渲染
  • 为什么在 C++ 中声明枚举时使用 typedef?

    我已经很多年没有写过任何 C 了 现在我正试图重新开始 然后我遇到了这个并考虑放弃 typedef enum TokenType blah1 0x00000000 blah2 0X01000000 blah3 0X02000000 Toke
  • C# Outlook 从收件人获取 CompanyName 属性

    我目前正在使用 C 编写 Outlook 2010 AddIn 我想要的是从我从 AppointmentItem 中提取的 Recipient 对象中获取 CompanyName 属性 因此 有了 AppointmentItem 的收件人
  • 为什么 C# 中同一类型的隐式和显式运算符不能共存? [复制]

    这个问题在这里已经有答案了 为什么同一类中两个相同类型的运算符 显式和隐式 不能共存 假设我有以下内容 public class Fahrenheit public float Degrees get set public Fahrenhe
  • 判断串口是普通COM还是SPP

    我正在寻找一种方法来确定 COM 是标准 COM 还是 SPP COM 也称为 COM 设备的电缆替换蓝牙适配器 我有一个可以在 USB COM gt USB 和蓝牙下工作的设备 并且蓝牙接口可以与 SPP 一起工作 我目前正在使用Syst
  • 检测 TextBox 中的 Tab 键按下

    I am trying to detect the Tab key press in a TextBox I know that the Tab key does not trigger the KeyDown KeyUp or the K
  • 为什么 std::function 不是有效的模板参数,而函数指针却是?

    我已经定义了名为的类模板CallBackAtInit其唯一目的是在初始化时调用函数 构造函数 该函数在模板参数中指定 问题是模板不接受std function作为参数 但它们接受函数指针 为什么 这是我的代码 include
  • 如何使用 C# 查询远程 MS ACCESS .mdb 数据库

    我正在尝试使用 C 查询 mote MS ACCESS 数据库 mdb 文件 将文件复制到本地计算机时可以成功查询它 我只想远程放置文件 所以我的客户端程序不包含原始数据 static string m path http www xyz
  • 将 2 个字节转换为整数

    我收到一个 2 个字节的端口号 最低有效字节在前 我想将其转换为整数 以便我可以使用它 我做了这个 char buf 2 Where the received bytes are char port 2 port 0 buf 1 port
  • MSChart 控件中的自定义 X/Y 网格线

    我有一个带有简单 2D 折线图的 C Windows 窗体 我想向其中添加自定义 X 或 Y 轴标记 并绘制自定义网格线 例如 以突出显示的颜色 虚线 我查看了 customLabels 属性 但这似乎覆盖了我仍然想显示的默认网格 这是为了
  • 如何测试某些代码在 C++ 中无法编译? [复制]

    这个问题在这里已经有答案了 可能的重复 单元测试编译时错误 https stackoverflow com questions 605915 unit test compile time error 我想知道是否可以编写一种单元测试来验证给
  • 与 Entity Framework Core 2.0 的一对零关系

    我正在使用 C 和 NET Framework 4 7 将 Entity Framework 6 1 3 Code First 库迁移到 Entity Framework Core 我一直在用 Google 搜索 Entity Framew
  • 当 Verb="runas" 时设置 ProcessStartInfo.EnvironmentVariables

    我正在开发一个 C 应用程序 我需要创建变量并将其传递给新进程 我正在使用ProcessStartInfo EnvironmentVariables 新进程必须提升运行 因此我使用 Verb runas var startInfo new
  • 对多个对象使用事件处理程序

    我有 20 件物品List
  • 在 C 中使用 #define 没有任何价值

    If a define没有任何价值地使用 例如 define COMMAND SPI 默认值是0吗 不 它的评估结果为零 从字面上看 该符号被替换为空 然而 一旦你有了 define FOO 预处理器条件 ifdef FOO现在将是真的 另
  • Unity,c++ 本机插件字节数组不匹配

    在我的 C 本机插件中 我有一个调用 vector
  • 如何知道 HTTP 请求标头值是否存在

    我确信这很简单 但是却让我感到厌烦 我在 Web 应用程序中使用了一个组件 它在 Web 请求期间通过添加标头 XYZComponent true 来标识自身 我遇到的问题是 如何在视图中检查此组件 以下内容不起作用 if Request
  • IDisposable 的显式实现

    虽然有很多关于IDisposable在 SO 上找到 我还没有找到答案 我通常遵循这样的做法 当我的一个班级拥有一个IDisposable对象然后它也实现IDisposable并打电话Dispose在拥有的对象上 然而最近我遇到了一个类 它
  • 是否可以使用 Dapper 流式传输大型 SQL Server 数据库结果集?

    我需要从数据库返回大约 500K 行 请不要问为什么 然后 我需要将这些结果保存为 XML 更紧急 并将该文件通过 ftp 传输到某个神奇的地方 我还需要转换结果集中的每一行 现在 这就是我正在做的事情 TOP 100结果 使用 Dappe

随机推荐

  • 【实战】将多个不规则多级表头的工作表合并为一个规范的一维表数据结果表...

    最近在项目里 有个临时的小需求 需要将一些行列交叉结构的表格进行汇总合并 转换成规范的一维表数据结构进行后续的分析使用 从一开始想到的使用VBA拼接字符串方式 完成PowerQuery的M语言查询字符串 然后转换成使用插件方式来实现相同功能
  • Unity-AR 简介

    Unity AR 简介 现有Unity AR Sdk ARKit 苹果推出的AR开发平台 ARCore Google 推出的增强现实 SDK ARFoundation ARFoundation是ARKit XR插件和ARCore XR插件
  • Linux下getopt函数的使用

    getopt为解析命令行参数函数 它是Linux C库函数 使用此函数需要包含系统头文件unistd h getopt函数声明如下 int getopt int argc char const argv const char optstri
  • CocosCreator用git版本控制时meta文件的冲突解决方法

    我们在多人进行CocosCreator开发时 需要对CCC的meta文件进行提交 meta文件里有CCC编辑器唯一识别的uuid 这个uuid是CCC编辑器对文件识别的唯一标识 如果我们不提交 会造成各个程序员电脑之间的CCC自动生成的uu
  • Fortify代码扫描工具

    一 Fortify介绍 Fortify是一款强大的静态代码扫描分析工具 其发现代码漏洞缺陷的能力十分强悍 主要是将代码经过编译 依托于其强大的内置规则库来发现漏洞的 其次fortify SCA团队在开发此商业工具时 也提供了自定义规则的接口
  • Python中的traceback的基本用法(异常处理)

    文章目录 一 Traceback介绍 二 Traceback中常用函数 1 traceback print tb 2 traceback print exception 3 traceback print exc 4 traceback f
  • MATLAB之function函数

    在MATLAB中 function函数用于定义一个新函数 用于将一定的输入 也称为参数 和输出变量与函数相关联 讲人话就是把自变量 函数和函数表达式定义为一个 可调用的函数块 由以下几个部分组成 function 关键字 首先得告诉MATL
  • stm32f103c8t6驱动oled

    要驱动OLED显示屏 您可以使用STM32F103C8T6微控制器及其相关的GPIO引脚和SPI总线接口 以下是驱动OLED显示屏的一些基本步骤 配置STM32F103C8T6的SPI总线接口 通过SPI总线发送命令和数据给OLED显示屏
  • iOS 自定义弹出框

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 在iOS中 系统再带的弹出窗体不好扩展 开发时候不如自定义一个弹出窗体 附加上显示和消失的动画 弹出窗体父类如下 具体效果直接往上面添加控件就行 ViewControlle
  • Jsp基于Web的可维护的数据库浏览器(源代码+论文+答辩PPT)

    1绪论 1 1Web应用系统 近十年来 基于Internet的应用正以前所未有的高速度发展 其中一个重要的方向就是基于Web的应用系统的发展 在此期间 随着技术的不断更新和应用的不断深入 Web应用系统的发展也经历了几个阶段性的跨越 图1
  • 什么是html网址,html是什么

    html语言是网络上的通用语言 也是比较简单的语言 对于想要在前端行业发展的人来说 html是必须要学的语言 那么 今天我们要来讲一下html是什么语言 html什么意思 以及html语言特点 什么是html HTML的英文全称是Hyper
  • 【C++】读取txt文件并查询指定字段

    目录 一 函数功能说明 二 代码 方法1 使用 lt lt 运算符 方法2 使用string getline 如果这篇文章对你有所帮助 渴望获得你的一个点赞 一 函数功能说明 函数名 说明 1 CompareFileFileds 按字符读取
  • 提高测试覆盖率的四大步骤

    什么是测试覆盖率 测试覆盖率衡量您测试了多少应用程序 这不仅与您执行的测试数量有关 它还与您查看的真实设备 浏览器和操作系统版本有关 您测试的设备和操作系统组合越多 测试覆盖的代码越多 测试覆盖率就越高 请注意 实现 100 的测试覆盖率是
  • enum与typedef enum的用法

    前些天发现了一个巨牛的人工智能学习网站 通俗易懂 风趣幽默 忍不住分享一下给大家 点击跳转到网站 https www captainai net db 一 两者的用法 枚举类型定义用关键字enum标识 形式为 enum 标识符 枚举数据表
  • Centos 7安装图形化系统

    Centos 7 图形化安装 点击创建新的虚拟机 进入虚拟机设置向导界面 自定义 高级 点击下一步 进入虚拟机硬件兼容性 默认下一步即可 点击下一步 进入安装客户端操作系统 选择稍后安装操作系统 点击下一步 进入选择客户机操作系统 选择Li
  • python3 内置方法 字符串转换为字典

    内置方法 eval 将字符串转换为字典代码 str backend www oldboy org record server 122 111 2 23 weight 20 maxconn 30 str to dict eval str pr
  • 【MongoDB for Java 1】

    获得数据库服务 Mongo m new Mongo localhost 27017 得到数据库mytest DB db m getDB dbtest 得到mytest数据库下所有表名 Set
  • 【自用】无法通过ESP32创建HomeAssistant实体问题解决(MQTT对ESP32创建实体请求无应答)

    一 问题描述 1 使用 MQTTX 测试客户端能够创建实体 当通过 MQTTX 发送注册实体请求的时候 实体能够在 MQTT 服务器中注册成功 2 使用 ESP32 无法创建实体 在ESP32中通过 publish 函数发送注册请求的时候
  • 数据库不推荐使用外键的9个理由!

    我的经验告诉我 很多数据库 大多数我曾经使用的 不包含外键时并不总是一件坏事 在这篇文章中 我想把重点放在为什么的原因上 为什么这是一个问题 1 潜在的数据完整性问题 缺少外键明显问题是数据库不能强制进行引用完整性检查 如果在高一层没有正确
  • 用指针访问一维数组

    文章目录 顺序查找 数组方式实现 指针实现方式 对一位数组元素的访问有三种方式 指针变量的关系运算 引例 数组实现方式 主函数 指针实现方式 主函数 一维数组作为函数的参数 实际应用 顺序查找 要求用指针实现 在整数集合r中顺序查找与给定值