C++学习笔记------指针基础概念(进阶)

遍历数组一共有三种方式

定义以下内容

int n[5] = { 5, 4, 3, 2, 1 };
int *pn = n;//一维数组名的值等价于&n[0]

1.利用下标访问数组元素

for (int i = 0; i < 5;i++)
{
	cout << n[i] << endl;//等价于*(n+i)
}

2.利用指针访问数组元素

for (int i = 0; i < 5;i++)
{
	cout << *(pn + i) << endl;
}
for (int i = 0; i < 5; i++)
{
	cout << *(n + i) << endl;
}

3.利用指针访问数组元素

for (int i = 0; i < 5; i++)
{	
	cout << pn << endl;
	//pn改变指向
	cout <<*pn++ << endl;//++优先级>*
}

求数组的内存大小

cout << sizeof(n) << endl;//20

求指针的内存大小

cout << sizeof(pn) << endl;//4
cout << sizeof(&n[0]) << endl;//4

数组指针

概念:指向数组的指针  &组名

定义: 类型 (*指针变量名)[大小];

         类型:指针变量指向数组的类型

         大小:指针变量指向数组的大小

int n[3][4] = {
		{1,2,3,4},
		{8,7,6,5},
		{9,10,11,12}
	};
	//定义一个数组指针的变量    &数组名
	int (*pn)[4]= n;//等价于&n[0]
	for (int i = 0; i < 3;i++)
		{
			//每一个一维数组的首地址
			cout << n + i << endl;//&n[i]
			//每一个一维数组的第一个元素的首地址
			cout << *(n + i) << endl;//n[i]
		}
	
	for (int i = 0; i < 3; i++)
	{
		for (int j = 0; j < 4;j++)
		{
			//n[i][j]等价于*(*(n+i)+j)
			cout << *(*(n + i)+j) << endl;//n[i]
		}
	}

	//检测数组的内存
	cout << &n[0][0] << endl;
	cout << &n[1][0] << endl;
	cout << &n[2][0] << endl;

	cout << n << endl;
	cout << &n[0] << endl;

	cout << n[0] << endl;
	cout << n[1] << endl;
	cout << n[2] << endl;


	int m[5];
	//&m[0]
	cout << m << endl;//数组第一个元素的首地址
	cout << &m << endl;//取数组的首地址
	cout << m + 1 << endl;//1个单位=int型大小
	cout << &m + 1 << endl;//1个单位=数组的大小

指针数组与二级指针

指针数组:数组中每一个元素都是指针

          类型 *数组名[大小];

二级指针:

          类型 **指针变量;

//求字节大小方法:三种类型的指针和指针数组  指针指向的类型(*取内容(如果为指针,去*号,如果为数组,去维数(从左往右)))
//定义一个数组指针,指针指向一个3行4列的int的二维数组
	int(*p)[3][4];
	cout << sizeof(p) << endl;//4   
	cout << sizeof(*p) << endl;//48  int(*p)[3][4]; -> int p[3][4]; 4*3*4
	cout << sizeof(**p) << endl;//16 int(*p)[3][4]; -> int p[4];    4*4
	cout << sizeof(***p) << endl;//4 int(*p)[3][4]; -> int p;		4

	int* (*p1)[4][5][6];
	cout << sizeof(p1) << endl;//4
	cout << sizeof(*p1) << endl;//4*4*5*6  int* (*p1)[4][5][6] -> int* p1[4][5][6]  4*4*5*6
	cout << sizeof(**p1) << endl;//4*5*6   int* (*p1)[4][5][6] -> int* p1[5][6]     4*5*6
	cout << sizeof(***p1) << endl;//4*6    int* (*p1)[4][5][6] -> int* p1[6]	    4*6
	cout << sizeof(****p1) << endl;//4	   int* (*p1)[4][5][6] -> int* p1;			4
	cout << sizeof(*****p1) << endl;//4    int* (*p1)[4][5][6] -> int  p1;			4

	//p2是一个3行4列二维数组,每一个元素都是指针(数组指针),该指针指向一个三维数组(该三维数组每一个元素都是int*型).
	int* (*p2[3][4])[4][5][6];
	cout << sizeof(p2) << endl;//4*3*4			int* (*p2[3][4])[4][5][6] -> int *p2[3][4] 4*3*4
	cout << sizeof(*p2) << endl;//4*4			int* (*p2[3][4])[4][5][6] -> int *p2[4]	  4*4
	cout << sizeof(**p2) << endl;//4			int* (*p2[3][4])[4][5][6] -> int *p2	  4
	cout << sizeof(***p2) << endl;//4*4*5*6;	int* (*p2[3][4])[4][5][6] -> int* p2[4][5][6] 4*4*5*6
	cout << sizeof(****p2) << endl;//4*5*6;		int* (*p2[3][4])[4][5][6] -> int* p2[5][6]	  4*5*6
	cout << sizeof(*****p2) << endl;//4*6		int* (*p2[3][4])[4][5][6] -> int* p2[6]	  4*6
	cout << sizeof(******p2) << endl;//4		int* (*p2[3][4])[4][5][6] -> int* p2	  4
	cout << sizeof(*******p2) << endl;//4		int* (*p2[3][4])[4][5][6] -> int  p2	  4


	int n[2][3];
	int *pn = n[0];//n[0]等价于 &n[0][0]
	int(*p3)[3]=n;//n等价于 &n[0]
	//int **pp = &n;//错误
	int **pp = &pn;//pn是int*型 pp指向的类型是int*

练习

int a[3][4] = {
		{ 1, 2, 3, 4 },
		{ 8, 7, 6, 5 },
		{ 9, 10, 11, 12 }
	};
	int * arr[3][4] = {
		NULL
	};
	//三种类型的指针和指针数组  指针指向的类型(*取内容(如果为指针,去*号,如果为数组,去维数(从左往右)))
	int *p1 = a[0];//p1是一个指针
	int **p2 = &p1;//p2是一个二级指针
	int(*p3)[4] = &a[0];//p3是一个数组指针,指向一个int型的一维数组
	int*(*p4)[4] = arr;//p4是一个指针,指向一个一维的数组,其数组内的每个元素都是int *型
	int*(*p5)[3][4] = &arr;//p5是一个指针,指向一个二维数组,其数组内的每个元素都是int *型
	int*(*p6[3])[3][4];		//p6是一个一维数组,每一个元素都是指针,其指向一个3*4的二维数组,数组内的每个元素都是int *型
	int*(**p7[3])[3][4];	//p7是一个一维数组,每一个元素都是二级指针,其指向一个3*4的二维数组,数组内的每个元素都是int *型
	int **(**p8[3])[3][4];	//p8是一个一维数组,每一个元素都是二级指针,其指向一个3*4的二维指针数组,数组内的每个元素都是int *型

	
	double** (**p9[3][4])[5][6];
	cout << sizeof(p9) << endl;//4*3*4
	cout << sizeof(*p9) << endl;//4*4
	cout << sizeof(**p9) << endl;//4
	cout << sizeof(***p9) << endl;//4
	cout << sizeof(****p9) << endl;//4*5*6
	cout << sizeof(*****p9) << endl;//4*6
	cout << sizeof(******p9) << endl;//4
	cout << sizeof(*******p9) << endl;//4
	cout << sizeof(********p9) << endl;//8

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值