当前位置: 首页 > news >正文

C语言指针操作(七)*指针数组和多重指针

在这里插入图片描述

学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。 

学习日记

目录

学习日记

前言​编辑

 一、什么是指针数组

二、指向指针数据的指针变量

例1

例2

 三、指针数组作main函数的形参

注意

C语言指针操作


前言

        指针这里分为八个小部分,分别是“指针变量”、“通过指针引用数组”、“*通过指针引用多维数组”、“通过指针引用字符串”、“*指向函数的指针”、“*返回指针值的函数”、“*指针数组和多重指针”、“*动态内存分配与指向它的指针变量” 。   

 一、什么是指针数组

类型名 *数组名[数组长度];                                int *p[4];

        一个数组,若其元素均为指针类型数据,称为指针数组,也就是说,指针数组中的每一个元素都存放一个地址,相当于一个指针变量。 指针数组比较适合用来指向若干个字符串,使字符串处理更加方便灵活。 

        将若干字符串按字母顺序(由小到大)输出。

#include <stdio.h>
#include <string.h>
int main()
{	void sort(char *name[],int n);		//函数声明
	void print(char *name[],int n);	//函数声明
	char *name[]={"Follow me","BASIC",
	"Great Wall","FORTRAN","Computer design"}; 
	//定义指针数组,它的元素分别指向5个字符串
	int n=5;
	sort(name,n); 	//调用sort函数,对字符串排序 
	print(name,n);	//调用print函数,输出字符串
	return 0;
}

void sort(char *name[],int n)			//定义sort函数
{	char *temp;
	int i,j,k;
	for(i=0;i<n-1;i++)			//用选择法排序
	{	k=i;
		for(j=i+1;j<n;j++)
			if(strcmp(name[k],name[j])>0) k=j;
		if(k!=i)
		{	temp=name[i]; name[i]=name[k]; name[k]=temp;}
	}
}

void print(char *name[],int n)	//定义print函数
{	int i;
	for(i=0;i<n;i++)
		printf("%s\n",name[i]);
		//按指针数组元素的顺序输出它们所指向的字符串
}

二、指向指针数据的指针变量

        在了解了指针数组的基础上,需要了解指向指针数据的指针变量,简称为指向指针的指针。

        name是一个指针数组,它的每一个元素是一个指针型的变量,其值为地址。name既然是一个数组,它的每一元素都应有相应的地址。数组名name代表该指针数组首元素的地址。name+i是name[i]的地址。name+i就是指向指针型数据的指针。还可以设置一个指针变量p,它指向指针数组的元素。p就是指向指针型数据的指针变量。 

name

name数组

字符串

name[0]

Follow me

p

name[1]

BASIC

name[2]

Great Wall

name[3]

FORTRAN

name[4]

Computer design

 定义一个指向指针数据的指针变量:char **p;

        p的前面有两个*号。p指向一个字符指针变量(这个字符指针变量指向一个字符型数据)。如果引用*p,就得到p所指向的字符指针变量的值。 

p=name+2;
printf(″%d\n″,*p);	//name[2]的值(它是一个地址)
printf(″%s\n″,*p);	//以字符串形式(%s)输出字符串″Great Wall″

例1

        使用指向指针数据的指针变量。

#include <stdio.h>
int main()
{	char *name[]={"Follow me","BASIC","Great Wall","FORTRAN","Computer design"};
	char **p;
	int i;
	for(i=0;i<5;i++)
	{	p=name+i;
		printf("%s\n",*p);
	}
	return 0;
}

指针数组的元素也可以不指向字符串,而指向整型数据或实型数据等。

例2

        有一个指针数组,其元素分别指向一个整型数组的元素,用指向指针数据的指针变量,输出整型数组各元素的值。

#include <stdio.h>
int main()
{	int a[5]={1,3,5,7,9};
	int *num[5]={&a[0],&a[1],&a[2],&a[3],&a[4]};
	int **p,i;				//p是指向指针型数据的指针变量
	p=num;				//使p指向num[0]
	for(i=0;i<5;i++)
	{	printf("%d ",**p);
		p++;
	}
	printf("\n");
	return 0;
}

利用指针变量访问另一个变量就是“间接访问”。 

如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”;

指针变量

变量

地址

 指向指针数据的指针用的是“二级间址”方法;

指针变量1

指针变量2

变量

地址1

地址2

从理论上说,间址方法可以延伸到更多的级,即多重指针。 

指针变量1

指针变量2

指针变量n

变量

地址1

地址2

地址n

 三、指针数组作main函数的形参

        指针数组的一个重要应用是作为main函数的形参。main函数的第1行一般写成

int main()    或    int main(void)

括号中是空的或有“void”,表示main函数没有参数,调用main函数时不必给出实参。

        在某些情况下,main函数可以有参数,int main(int argc, char *argv[])

        argc和argv就是main函数的形参,它们是程序的“命令行参数”。argc(argument count的缩写,意思是参数个数),argv(argument vector缩写,意思是参数向量),它是一个*char指针数组,数组中每一个元素(其值为指针)指向命令行中的一个字符串的首字符。

注意

        如果用带参数的main函数,其第一个形参必须是int型,用来接收形参个数(文件名也算一个参数),第二个形参必须是字符指针数组,用来接收从操作系统命令行传来的字符串中首字符的地址。 

C语言指针操作

C语言指针操作(一)指针变量

C语言指针操作(二)通过指针引用数组

C语言指针操作(三)*通过指针引用多维数组 

C语言指针操作(四)通过指针引用字符串

C语言指针操作(五)*指向函数的指针

C语言指针操作(六)*返回指针值的函数

C语言指针操作(七)*指针数组和多重指针 

相关文章:

  • 【python经验总结】我与bug的那些日子
  • <栈和队列及模拟实现>——《Data Structure in C Train》
  • 猿创征文|【Typescript】搭建TS的编译环境
  • 【项目管理】beautyeye
  • Connor学Android - HandlerThread和IntentService
  • Github每日精选(第31期):macOS 下的亮度和音量调节MonitorControl
  • Vue.js核心技术解析与uni-app跨平台实战开发学习笔记 第7章 Vue.js高级进阶 7.10 路由守卫
  • 金融核心系统云原生转型的三个挑战、六个误区和四个步骤
  • zsh安装以及ROS适配
  • 猿创征文|FlexManager与阿里云MQTT通讯
  • Linux指令——crontab
  • 程序员的中秋
  • mysql数据库的安装教程
  • 新电脑的正确打开方式——(近万字图文并茂详细分步骤讲解)【包括个性锁屏,磁盘分区……】等你来解锁哦
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • AWS实战 - 利用IAM对S3做访问控制
  • CODING 缺陷管理功能正式开始公测
  • download使用浅析
  • exif信息对照
  • Go 语言编译器的 //go: 详解
  • JavaScript-Array类型
  • Java教程_软件开发基础
  • Laravel 实践之路: 数据库迁移与数据填充
  • Mocha测试初探
  • PHP的类修饰符与访问修饰符
  • Python学习之路13-记分
  • windows下使用nginx调试简介
  • 读懂package.json -- 依赖管理
  • - 概述 - 《设计模式(极简c++版)》
  • 技术胖1-4季视频复习— (看视频笔记)
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 如何设计一个微型分布式架构?
  • 推荐一个React的管理后台框架
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (4)Elastix图像配准:3D图像
  • (C#)获取字符编码的类
  • (C语言)字符分类函数
  • (第一天)包装对象、作用域、创建对象
  • (力扣)1314.矩阵区域和
  • (六)激光线扫描-三维重建
  • (三分钟)速览传统边缘检测算子
  • (四) Graphivz 颜色选择
  • (四) 虚拟摄像头vivi体验
  • *p=a是把a的值赋给p,p=a是把a的地址赋给p。
  • .gitignore文件—git忽略文件
  • .htaccess配置常用技巧
  • .NET Core MongoDB数据仓储和工作单元模式封装
  • .NET/C# 使用 SpanT 为字符串处理提升性能
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET开源快速、强大、免费的电子表格组件
  • .NET轻量级ORM组件Dapper葵花宝典
  • .xml 下拉列表_RecyclerView嵌套recyclerview实现二级下拉列表,包含自定义IOS对话框...
  • @Transaction注解失效的几种场景(附有示例代码)
  • @value 静态变量_Python彻底搞懂:变量、对象、赋值、引用、拷贝
  • [].shift.call( arguments ) 和 [].slice.call( arguments )