指针和数组--指针数组及其应用

news2024/11/15 21:51:25

目录

一、指针数组用于表示多个字符串

二、指针数组用于表示命令行参数


一、指针数组用于表示多个字符串

        一维数组可存储一个字符串,二维数组可存储多个字符串。

        二维数组的元素在内存中是连续存放的,存完第一行后,再存第二行,以此类推。所以,无论每个字符串的实际长度是否一样,在内存中都占有相同长度的存储单元,都要按照最长的字符串的长度来为每个字符串分配内存。在交换字符串时,需要对每个字符串都进行操作,因此字符串排序的速度非常慢。

指针数组(Pointer Array):

        指针数组和指向数组的指针是有区别的,指向数组的指针是一个指针变量,指针变量中保存的是一个数组的首地址。

        指针数组是一个数组,只不过是指针作为数组的元素,形成了指针数组。由若干个类型相同的指针所构成的数组,称为指针数组(Pointer Array)。

        由定义可知,指针数组的每个元素都是一个指针,且这些指针指向相同数据类型的变量。

指针数组的最主要的用途之一就是对多个字符串进行处理操作。虽然有时字符指针数组和二维字符数组能解决同样的问,但涉及多字符串处理操作时,使用字符串指针数组比二维字符数组更有效。

例题:输入不同国家的英文名称,按首字母进行排序。

#include <stdio.h>
#include <string.h>
#define MAX_LEN 10//字符串最大长度
#define N 		150//字符串个数

void sortstring(char *ptr[],int n);//作交换的函数

int main(void)
{
	int i,n;
	char name[N][MAX_LEN];//定义二维数组
	char *pstr[N];//定义字符串指针数组
	printf("How many countries?");
	scanf("%d",&n);
	getchar();        //读走输入缓冲区中的回车符
	printf("Input their names:\n");
	for(i=0;i<n;i++)
	{
		pstr[i]=name[i];//让pstr[i]指向二维字符数组name的第i行
		gets(pstr[i]);//输入第i个字符串到pstr[i]指向的内存
	}
	sortstring(pstr,n);//字符串按字典顺序排序
	printf("Sorted results:\n");
	for(i=0;i<n;i++)
	{
		puts(pstr[i]);
	}
	return 0;
 } 
 
//函数功能:用指针数组作函数参数,采用交换法实现字符串按字典顺序排序。
void sortstring(char *ptr[],int n)
{
	int i,j;
	char *temp = NULL;
	for(i=0;i<n-1;i++)
	{
		for(j=i+1;j<n;j++)
		{
			if(strcmp(ptr[j],ptr[i])<0)
			{
				temp=ptr[i];
				ptr[i]=ptr[j];
				ptr[j]=temp;
			}
		}
	}
}

 注意:因指针数组的元素是一个指针,所以与指针变量一样,在使用指针数组之前必须对数组元素进行初始化。指针变量未初始化,其值是不确定的,此时对其进行写操作是很危险的。

        在交换过程中,排序只改变了原来指针数组pstr的元素指向,并未改变二维字符数组name中字符串的排序顺序:

结尾:通过移动字符串在实际物理存储空间中的存放位置而实现的排序,称为物理排序;而用指针数组存储每个字符串的首地址时,字符串排序时无需改动字符串在内存中的存储位置,只要改变指针数组总个元素的指向即可。

        这种通过移动字符串的索引地址实现的排序,称为索引排序。 

二、指针数组用于表示命令行参数

        在DOS操作系统下,将文件file1.c的内容复制到文件file2.c中,用如下命令:

        copy file1.c   file2.c

        这种运行程序的方式称为命令行,copy、file1.c和file2.c称为命令行参数(Command Line Arguments)。命令行参数中的copy为赋值操作的命令名,另外两个参数file1.c和file2.c分别代表复制的源文件和目标文件的文件名,它们之间多了一个或多个空格分隔。

        在c程序中,命令行参数是如何传递给程序的呢?

        事实上,函数main()是通过形参获得这些参数的,因此需要使用带参数的main()形式。

例题:演示命令行参数和函数main()之间的关系。

#include <stdio.h>

int main(int argc,char *argv[])
{
	int i;
	printf("The number of command line arguments is :%d\n",argc);
	printf("The program name is :%s\n",argv[0]);
	if(argc>1)
	{
		printf("The other arguments are following :\n");
		for(i=1;i<argc;i++)
		{
			printf("%s\n",argv[i]);
		}
	}
	return 0;
}

此程序只做演示,结果如下:

命令行参数很有用,尤其在Linux操作系统下或批处理命令使用较为广泛。

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

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

相关文章

多线程之JUC

写在前面 本文一起看下jdk并发包的相关内容。 1&#xff1a;JUC包提供了哪些功能 先通过包结构看下JUC提供的功能&#xff1a; 接下来分别看下。 1.1&#xff1a;锁 JUC中的锁机制提供了比synchronized&#xff0c;wait/notify更加灵活的同步控制&#xff0c;在java.util.…

大数据基础平台实施及运维进阶

1、完全分布式部署介绍 完全分部式是真正利用多台Linux主机来进行部署Hadoop&#xff0c;对Linux机器集群进行规划&#xff0c;使得Hadoop各个模块分别部署在不同的多台机器上。 2、nameNode HA完全分布式部署 2.1、nameNode切换方法 分别处于Active和Standby中 hadoop可以…

操作系统复习笔记4

1、queueType队列类型 队列中的数据也呈线性排列。虽然与栈有些相似&#xff0c;但队列中添加和删除数据的操作分别是在两端进行的。 线性表有顺序存储和链式存储&#xff0c;队列作为一种特殊的线性表&#xff0c;也同样存在这两种存储方式。 1.1 顺序队列 用数组存储队列…

C语言学习(二十五)---指针练习题(一)

在上一节内容中&#xff0c;我们学习了递归与冒泡排序法的有关内容&#xff0c;今天我们将继续往下学习&#xff0c;主要内容为指针练习题&#xff0c;好了&#xff0c;话不多说&#xff0c;开整&#xff01;&#xff01;&#xff01; 在之前的第18—22的内容中&#xff0c;我…

lnmp框架的应用

目录 应用一 nginx访问状态统计 1.先查看http_stub_status有没有安装 2.进入nginx的配置文件改配置 3.nginx-检查配置 重启服务 最后这个20就是显示的状态统计 应用二 给网站加密 1.首先安装http-tools软软件 2.把nginx设置锁也要有执行权限 3.进入nginx配置文件 4. 检查…

【Windows个性化设置篇】StartAllBack更改win11任务栏设置

【Windows个性化设置篇】StartAllBack更改win11任务栏设置 Windows11目前不支持更改任务栏位置固定的修改&#xff0c;因为想把任务栏固定到旁边&#xff0c;从而充分利用电脑屏幕位置。之前试过TranslucentTB可以把任务栏透明化&#xff0c;很漂亮&#xff0c;但在分屏操作时…

【Vue3】Vue3+Vite+TS使用npm包引入百度地图

文章目录 Vue3ViteTS引入百度地图一、注册二、安装依赖包三、参考文档四、全局注册五、局部导入六、断网地图的使用八、项目使用成功图片九、使用卫星图 Vue3ViteTS引入高德地图npm包查找地图依赖包 Vue3ViteTS引入百度地图 一、注册 官网&#x1f449;百度地图开放平台 注册…

python---案例分析(1)

标准库 python自带的 第三方库 其他人做出来的 例1: 实现一个日期计算器 EG: 计算2012年2月14日和2016年2月3日之间的差值 使用datetime 1.根据日期构造出datetime类型的变量 2.把两个变量进行相减,得到的结果即为所求 1) 2) 3) 例2: 实现单词逆序 翻转单词顺序 i am a s…

MySQL数据库表的操作

创建表 语法&#xff1a; CREATE TABLE table_name (field1 datatype,field2 datatype,field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明&#xff1a; field 表示列名。 datatype 表示列的类型。 character set 字符集&#xff0c;如果没有指…

hutool包下的BeanUtil工具使用、SQL中的and和OR的优先级

SQL中的and和OR的优先级 首先and的优先级大于or&#xff0c;通俗理解其实or查询其实会把条件分为左右两边来查。 如select * from user where id 1 and status 2 or status 3,本来想查询user表中id为1的状态为2或者3的数据&#xff0c;其实只会这样执行&#xff0c;and比or…

大数据分析案例-基于LightGBM算法构建航空公司满意度预测模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

DOD Digital Engineering Vision 数字工程策略与实施

DOD Digital Engineering Vision DOD的数字工程策略与实施&#xff0c;仅供个人学习使用&#xff0c;不代表个人意见和观点&#xff01;&#xff01;&#xff01; Digital Engineering Strategy and Implementation Ms. Philomena Zimmerman Office of the Under Secretary …

day1

在linux内核中&#xff0c;当用户打开设备文件时&#xff0c;内核中的VFS层会调用设备驱动中的sys_open()函数&#xff0c;在sys_open()函数中&#xff0c;内核会根据文件的inode号判断文件是否存在于文件系统中&#xff0c;如果存在&#xff0c;内核会找到这个文件的文件信息结…

Python:使用钉钉dingtalk发送通知消息

通过钉钉的开放API接口&#xff0c;可以很容易的将消息发送到钉钉dingtalk&#xff0c;比起邮件发送更稳定&#xff0c;及时 文档 官网&#xff1a;https://www.dingtalk.com/API Explorer调试 https://open-dev.dingtalk.com/apiExplorer 目录 方式一&#xff1a;webhook方式…

Search space set group switching(一)

欢迎关注同名微信公众号“modem协议笔记”。 根据R17 38.300的描述&#xff0c;UE可以通过PDCCH monitoring adaptation机制实现power saving的目的&#xff0c;这其中就包括PDCCH monitoring skipping和search space set group (SSSG) switching两种机制。PDCCH monitoring s…

dom4j 解析 mybatis mapper xml 文件

01: CarMapper.xml : <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"car"…

代码随想录 回溯算法 Java

文章目录 组合&#xff08;*中等&#xff09;77. 组合&#xff08;*中等&#xff09;17. 电话号码的字母组合&#xff08;中等&#xff09;39. 组合总和&#xff08;中等&#xff09;40. 组合总和II&#xff08;中等&#xff09;216. 组合总和||| 分割&#xff08;*中等&#x…

【王道操作系统】内存管理

内存管理概念 1.C 2.D 存储保护的作用&#xff1a;保证各道作业在各自的存储空间内运行&#xff0c;互不干扰 实现虚拟内存管理需要请求分页&#xff08;请求分段、请求段页&#xff09;等技术的支持&#xff0c;故需要硬件支持&#xff0c;比如页表机制、中断机构、地址变换…

【五子棋实战】第1章 项目架构与开发思路

【五子棋实战】第1章 项目总览 前言 ## 项目技术栈 ## 项目可配置性 博客目录 项目预览 项目代码获取 项目架构 ## 架构&#xff1a;前端页面 算法接口 ## 前端页面 ## 算法接口 开发思路 前言 五子棋是一种古老而受欢迎的棋类游戏&#xff0c;本博客将介绍如何使用…

Matplotlib-直方图、箱型图

1. 直方图 hist函数来创建一个直方图。下面是对各个参数的解释&#xff1a; x&#xff1a;要绘制直方图的数据序列。bins&#xff1a;指定直方图的边界范围和间隔。这里使用range(40, 110, 6)表示边界从40到110&#xff0c;间隔为6。facecolor&#xff1a;直方图的填充颜色。…