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语言指针操作(七)*指针数组和多重指针 

C语言指针操作(八)*动态内存分配与指向它的指针变量 

猜你喜欢

转载自blog.csdn.net/m0_63794226/article/details/126597206