二维数组和指针

给一个二维数组 int arry[2][3] = { {1,2,3},{4,5,6} };输出第二行第二列的元素

#include "stdafx.h"
#include <iostream>
using namespace std;
int main()
{
	int arry[2][3] = { {1,2,3},{4,5,6} };//输出第二行第二列的元素
	//1 数组名下标访问
	cout <<"solutions 1: 2-2 is:" << arry[1][1] << endl;

	//2 二维数组指针
	int(*p1)[2][3] = &arry;
	cout << "solutions 2: 2-2 is:" << (*p1)[1][1] << endl;

	//3 一维数组指针
	int(*p2)[3] = &(arry[0]);
	cout << "solutions 3: 2-2 is:" << (*(p2 + 1))[1] << endl;

	//4 一级指针
	int* p3 = &arry[0][0];
	cout << "solutions 4: 2-2 is:" << *(p3 + 4) << endl;

#if 1
	//5 二级指针 将指向二维数组每一行一维数组的指针保存在一个指针数组中
	int* s[2] = { arry[0],arry[1] };
	int** t = s; //t是指向指针数组的指针,指针数组每个元素都是指针,存放指针地址的指针是二级指针
	cout << "solutions 5: 2-2 is:" << (*(t + 1))[1] << endl;
#endif

    return 0;
}

1、二维数组名通过下标直接访问指定元素

2、p1是二维数组指针,指向一个2行3列的二维数组,指针偏移是按照一个完整的二维数组去偏移的,*p1代表的是p1指向的具体某一个二维数组,进入一个二维数组内部,用下标访问指定元素(*p1)[1][1]

3、p2是一维数组指针,指向一个有3个元素的一维数组,指针偏移是按照一个完整的一维数组去偏移,p2 + 1是指向了二维数组中的第二个一维数组,*(p2 + 1)代表的是得到第二个具体的一维数组,进入一维数组内部,用下标访问指定元素,*(p2 + 1)[1]

4、p3是一个一级指针,指向一个int 变量,p3初始值是指向二维数组2行3列6个元素中的第一个,那第2行第2列是第4个元素,即p3[4]

5、将二维数组的每一个一维数组用一个一维数组指针保存,再将多个一维数组指针用一个一维指针数组保存,然后再用一个二级指针,保存这个一维指针数组  s是一个指针数组,每个元素都是指针,t是一个二级指针,t = s  等价于 t = &s[0]           t+1 代表的是s[1],也就是arry[1]   *(t + 1)进入这个一维数组内部,通过下标访问指定元素 *(t + 1)[1]

用一个一级指针,可以保存一个普通变量的一维数组,eg:int a[3] = {1,2,3};int* ap = a; ap[1]代表第二个元素

用一个二级指针,可以保存一个指针变量的一维数组,eg: int* a[3] = {arry[0],arry[1]}; int** ap = a; (*(ap + 1))[1]代表的是arry[1]这个一维数组的第2个元素,注意,[]的优先级高于*,所以用括号括起来

#include "stdafx.h"
#include <iostream>
using namespace std;
int main() {
	
	char *str1[3] = { "a", "b", "c" };
	printf("str1 = %x\n", str1);
	char** p1 = str1;
	for (p1; p1 < str1 + 3; p1++) { 
		printf("p1 = %x\n", p1); 
		printf("*p1 = %s\n", *p1);
	}	

	char str2[][20] = { "d", "e", "f" };
	char(*p2)[20] = str2;
	for (p2; p2 < str2 + 3; p2++) { 
		printf("p2 = %s,p2值 = %x\n", p2,p2);
		printf("*p2 = %s,*p2的值 = %x\n", *p2,*p2);
	}
	printf("%s", "it is a string\n");

	int arry[10] = { 1, 2, 3 };
	printf("&arry[0] = %x,arry = %x, &arry = %x\n", &arry[0], arry, &arry);
	
	int arry2[2][3] = { {1,2,3},{4,5,6} };
	int(*p3)[3] = arry2;
	for (p3;p3 < arry2 + 2;++p3)
	{
		printf("p3 = %x\n", p3);
		printf("*p3 = %x\n", *p3);
		printf("*p3 = %x\n", *(p3 + 1));
	}	
}

1、str1是指针数组,每个元素都是一个指针,数组名就是数组首地址

2、p1是二级指针,保存一个指针数组str1,p1的值就是str1的地址

3、p1代表的是整个指针数组,*p就是*(str1[0]),就是指针数组第一个元素的值,就是字符串"a",字符串代表字符串首地址

4、p2是个指向有20个元素的一维数组指针,代表这个二维数组的地址

5、*p2代表获得这个二维数组的第一个一维数组

6、字符串作为参数传递给printf,就是把字符串的首地址传递给了printf

7、 &arry[0], arry, &arry 都代表同一个地址,数组名就是数组的首地址,就是数组第一个元素的地址

8、p3是二维数组首地址

9、*p3是二维数组的第一个一维数组实体

10、*(p3 + 1)是二维数组的第二个一维数组实体
    

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码成行

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值