C指针9:指针数组(即数组中的每个元素都是指针)

前边已经讲过数组指针,强调的是指针,意思就是该指针指向的是数组(数组里边的元素一般为普通数据)。

指针数组,强调的是数组,意思就是该数组里边的每个元素都是指针类型。即如果一个数组中的所有元素保存的都是指针,那么我们就称它为指针数组。

形式如下:

dataType *arrayName[length];
//[ ]的优先级高于*,该定义形式应该理解为: 
dataType *(arrayName[length]);//先强调数组,再说数组的元素是指针

括号里面说明arrayName是一个数组,包含了length个元素,括号外面说明每个元素的类型为dataType *

除了每个元素的数据类型不同,指针数组和普通数组在其他方面都是一样的,下面是一个简单的例子:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

int main() {
	int a = 13, b = 32, c = 0;
	int *arr[3] = { &a, &b, &c };//	//定义一个指针数组  //也可以不指定长度,直接写作int *arr[]							
	int **parr = arr; //定义一个指向指针数组的指针
	//它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。
	printf("%d, %d, %d\n", *arr[0], *arr[1], *arr[2]);//输出数据
	cout << "数组元素的地址:" << arr[0] << " , " << arr[1] << " , " << arr[2] << endl;//地址
	cout<<"&abc: "<< &a<< " , " << &b << " , " << &c << endl;//地址
	//parr是一个指针,parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,第一个元素是地址,所以*parr是第一个元素的值也就是地址,**parr是取的第一个元素即地址里边的数据也就是a的值13
	cout << "*parr= " << *parr << endl;//*parr表示数组首地址 即**parr=&arr
	cout << "**parr= " << **parr << endl;//**parr=13
	printf("%d, %d, %d\n", **(parr + 0), **(parr + 1), **(parr + 2));

	return 0;
}

结果如下:

arr 是一个指针数组,它包含了 3 个元素,每个元素都是一个指针,在定义 arr 的同时,我们使用变量 a、b、c 的地址对它进行了初始化,这和普通数组是多么地类似。

parr 是指向数组 arr 的指针,确切地说是指向 arr 第 0 个元素的指针,它的定义形式应该理解为int *(*parr),括号中的*表示 parr 是一个指针,括号外面的int *表示 parr 指向的数据的类型。arr 第 0 个元素的类型为 int *,所以在定义 parr 时要加两个 *。

第一个 printf() 语句中,arr[i] 表示获取第 i 个元素的值,该元素是一个指针,还需要在前面增加一个 * 才能取得它指向的数据,也即 *arr[i] 的形式。

第二个 printf() 语句中,parr+i 表示第 i 个元素的地址,*(parr+i) 表示获取第 i 个元素的值(该元素是一个指针),**(parr+i) 表示获取第 i 个元素指向的数据。

指针数组还可以和字符串数组结合使用,请看下面的例子:

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

int main() 
{
	char *str[3] = {
		"a.bc.com",
		"C中国",
		"L China"
	};//str是字符数组,str[3]里边的每一个元素都是char *类型都是指针类型
	printf("%s\n%s\n%s\n", str[0], str[1], str[2]);//str[0]是char*类型,相当于 char *str0 = "c.biancheng.net";
	cout << *str[0] << endl;//数组里边第一个元素里边的第一个元素
	cout << *str[1] << endl; //数组里边第二个元素里边的第一个元素
	cout << *str[2] << endl; //数组里边第三个元素里边的第一个元素
	cout << str[0] << endl;//数组里边的第一个元素
	return 0;
}

结果如下:

需要注意的是,字符数组 str 中存放的是字符串的首地址,不是字符串本身,字符串本身位于其他的内存区域,和字符数组是分开的。
也只有当指针数组中每个元素的类型都是char *时,才能像上面那样给指针数组赋值,其他类型不行。

为了便于理解,可以将上面的字符串数组改成下面的形式,它们都是等价的。

#include <stdio.h>
#include <iostream>
#include <string.h>
using namespace std;

int main() {
	char *str0 = "a.bc.com";
	char *str1 = "C中国";
	char *str2 = "L China";
	char *str[3] = { str0, str1, str2 };
	printf("%s\n%s\n%s\n", str[0], str[1], str[2]);
	return 0;
}

结果如下:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章