C语言--对于指针数组与多重指针的理解

人之所以痛苦,那是因为你在成长。--------magic_guo

1.指针数组
数组是存放一批同类型数据的容器,其中的元素可以是整型、浮点型、字符,也可以是指针型等,存放内存地址的数组叫做指针数组,就像返回指针类型的函数一样(被称为指针函数)。

定义指针数组的方式:
类型名 * 数组名 [数组长度]
例如:int * num[4]
这个定义的理解:根据运算符先后等级,括号优先级高,num先于中括号结合,表示数组,然后与前面的int * 结合,表示此数组存放的是指向整型数据的指针,4表示此指针数组的长度为4。

指针数组的应用:

# include<stdio.h>
# include<string.h>

//使用指针数组将若干字符串按顺序输出

int main(void)
{
	void sort(char * name[], int n);		//函数声明
	void print(char * name[], int n);		//函数声明
	// 定义指针数组,进行初始化,它的元素分别指向5个字符串
	char * name[] = {"Follow me", "BASIC", "Great Wall", "FORTRAN", "Computer design"};
	
	int n = 5;
	sort(name, n);
	print(name, n);

	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)
{
	int i;
	for (i=0; i<n; i++)
	{
		printf("%s\n", name[i]);
	}
}

结果:
在这里插入图片描述
这两个函数都使用了指针数组作为参数,当把name作为实参传进函数,这时候name指向的是指针数组的第0号元素,但是第0号元素也是一个char类型的指针变量,在sort函数中,因此要将temp定义为指针类型;在print函数中,使用%s可直接将字符串输出。
这里最难理解的是选择排序,选择排序的思路方法都是一样的,在全局范围内找出最小的,然后找出第二小的,以此类推;可能有时候写代码的方式不同,但是万变不离其宗。
strcmp(str1, str2)此函数是字符串函数库中的函数,使用于字符串的比较。
比较规则:在英文字典中,位置在后面的为“大”。另外,小写字母在大写字母的后面,所以比如说小写的“0”,stolen和大写的“O”,stOlen,相比较;
strcmp(stolen, stOlen) >0;
此函数只能用来比较字符串,不能比较的单个字符。

2.多重指针
多重指针即:指向指针的指针;可以分为更多的等级;
和上面所说的指针数组一样,name数组存放了各个元素的地址,而且数组名又是数组元素的首地址,name指向类首元素的地址,则首元素也是指针类型,因此name则是指针的指针;

定义指针数据的指针变量:
例如:
int ** p;
理解:*运算符的结合是从右到左的,p相当于 * ( * p),*p是指针变量,则p则是指针的指针。

例题1:

# include<stdio.h>

// 使用指针数据的指针变量
int main(void)
{
	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(void)
{
	int a[5] = {2, 4, 6, 8, 10};
	int * num[] = {&a[0], &a[1], &a[2], &a[3], &a[4]};
	int **p, i;
	p = num;
	for (i=0; i<5; i++)
	{
		// printf("%d\n", *(*p+i));
		printf("%d\n", **p);
		p++;
	}
	
	return 0;
}

在这里插入图片描述

指针与数组的结合形很强,一般要对数组进行操作,避免不了要是用指针;在概念上指针数组与多重指针是一样的,只要理解了指针数组,则多重指针也易如反掌,虽然关于指针的知识比较绕,但是我们要看清指针的真面目!
加油!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值