【C/C++】一篇文章教你区分数组指针&指针数组

1数组指针:

指向数组的指针,(可以理解为指向数组首元素地址的地址)本质是指针。

#include<iostream>
using namespace std;
//指针是基本数据变量类型,地址是数值,指针用来装地址
int main()
{
	int a[5] = { 12,25,32,4,1 };
	int *p = &a[0];//int型指针装数组中第1个元素12的地址
	int(*p1)[5] = &a;//数组指针,装数组a的地址,5是数组a的大小,
	//*p1可以理解为数组第一个元素地址的地址

	//int(*p1)[6] = &a; 【6】不可以!必须相等!!否则报错!!!
	
	//*p == a[0] == 12;
	//p==*p1 == a == &a[0];//p是这个数组 首元素的地址(首地址) 
	//  p+1指向第一个数组第二个元素
	
	//p1==&a;                p1是这整个数组的地址            
	//   p1+1指向第二个数组 
	//**p1==*p==a[0]=12;

	cout << p << endl << *p1 << endl << &a << endl;
	//第一个数组地址即这个数组首元素地址

	//cout << ++p1 endl;偏移后p1变化会影响后面输出

	cout << &a + 1 << endl << *p1 + 1 << endl; //偏移后不会影响后面输出

	cout << (*p1)[2]<<endl;
	//a是第一个数组,p1[2]是第三个数组  
	//*p1[2]是第三个数组的首元素
	cout << *(*p1 + 2) << endl;

	cout << p[2] << endl;
	cout << 2[p] << endl;
	cout << *(p + 2) << endl;
	cout << a[2] << endl;

	//p1是(数组)指针的名字
	//注意小括号使用,因为[]优先级高于*
	system("pause");
}

2指针数组:

存放指针的数组,(可以理解为一个数组里装了一堆地址)本质是数组。

//数组元素为指针的数组称之为指针数组。指针数组可以让每个数组元素指向不同的内存块,实现对不同大小的内存块的数据统一管理。
//程序:从键盘输入一组字符串使用指针数组对他们进行由小到大的排序并输出
#include<iostream>
using namespace std;
int main()
{
	int b = 3,
		c = 5,
		d = 1,
		e = 7,
		f = 2;

	int *a[5] = { &b,&c,&d,&e,&f};//指针数组a装5个元素的地址
	cout << d << endl;
	*a[2] = 9;//== d=9;改变d的值
	cout << d << endl;

	//指针数组拉链结构,不同于2维数组!!指针数组内的不同数组之间各元素不是连续的
	int q[2] = { 3,2 },
		w[3] = { 5,2,6 },
		h[2] = { 9,4 },
		r[5] = { 7,5,4,3,1 };
	*(r) = 9;
	int *t[4] = { &q[0],w,h,r };
	//t是(指针)数组的名字,4是该数组的大小
	//也可以用 int * (t[6])={ &q[0],w,h,r };即定义大一点的数组来装地址,没用到的空间不影响 
	cout << *(t[1]+0) << endl;//输出w[0]即5
	cout << t[1][0] << endl;
	

	
	char ch[5][20];
	char *pch[5];
	int i, j;
	for (i = 0; i <5; i++)
	{
		cin.getline(ch[i], 20);//键盘输入字符串,给字符数组赋值
		pch[i] = ch[i];//将个字符串的首地址传给指针数组各元素
		cout << &pch[i];
	}
	//排序
	
	system("pause");
	return 0;
}

©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页