38_二维数组指针

//_38_二维数组指针
//_38_main.cpp

//实例:有一个班级共三名学生各学习四门课,要求计算出这个班级的额总平均分
//以及第n个学生的成绩

#include <stdio.h>
#include <stdlib.h>

int main()
{
	//声明子函数
	void average(float *point,int n);
	void search(float(*point)[4],int);

	//定义一个静态存储数组并赋初值
	static float score[4][4]={{76,90,92,87},{78,68,69,94},
	                                     {45,56,67,78},{78,68,69,94}};
	printf("班级的总平均分:");
	average(*score,16);//传入score[0]的地址
	printf("请输入学生的学号(0-3):");
	int number;
	scanf("%d",&number);
	search(score,number);//传入第0行首地址
	system("pause");
	return 0;
}

//子函数定义
void average(float *point,int n)//point是一个指向实型变量的指针变量
{
	float *p_end;
	p_end=point+n-1; 
	float sum=0;
	for(;point<p_end;point++)
		sum=sum+*point;
	float aver=sum/n;
	printf("%5.2f\n",aver);
}
//指向指针数组的指针
void search(float (*point)[4],int n)//point是一个指向包含四个元素的一维数组的指针变量
{
	//*(point+n)是point[n]的地址
	//(*(point+n)+i)是point[n][i]的地址
	for(int i=0;i<4;i++)
		printf("%5.2f ",*(*(point+n)+i));
	printf("\n");
}

### 二维数组指针的关系详解 在C/C++中,二维数组指针之间的关系可以通过以下几个方面进行详细解释。 #### 1. 二维数组的内存布局 二维数组在内存中是以一维数组的形式存储的。例如,对于一个二维数组 `int arr[3][4]`,它在内存中的存储顺序是从左到右、从上到下依次排列的。这意味着,`arr[0][0]` 到 `arr[2][3]` 是连续存储的[^1]。 #### 2. 数组名作为指针 当提到二维数组时,数组名可以被看作指向其第一个元素的指针。例如,在 `int arr[3][4]` 中,`arr` 可以被看作指向 `arr[0]` 的指针,而 `arr[0]` 是一个指向 `int` 类型的一维数组。因此,`arr` 的类型是 `int (*)[4]`,即指向包含 4 个整数的一维数组的指针[^3]。 #### 3. 指针二维数组的操作 通过指针操作二维数组时,可以使用指针算术来访问数组中的元素。例如: ```c int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int (*p)[4] = arr; // p 是指向包含 4 个整数的一维数组的指针 printf("%d\n", *(*(p + 1) + 2)); // 输出 7 ``` 上述代码中,`p` 被定义为指向包含 4 个整数的一维数组的指针,`p + 1` 表示指向第二行,`*(*(p + 1) + 2)` 表示访问第二行第三列的元素[^3]。 #### 4. 二级指针二维数组 在某些情况下,可以使用二级指针(`int**`)来模拟二维数组的行为。例如: ```c int a[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int (*p)[4] = a; // p 是指向包含 4 个整数的一维数组的指针 int **q = (int **)a; // q 是二级指针 printf("%d\n", q[1][2]); // 输出 7 ``` 需要注意的是,`a` 和 `a[0]` 的值不同。`a` 是指向指针构成的数组的第一个元素的指针,其类型为 `int**`,而 `a[0]` 是指向第一个一维数组的指针,其类型为 `int*`[^4]。 #### 5. 指针数组与二维数组指针的区别 指针数组和二维数组指针在定义时非常相似,但括号的位置不同会导致它们的含义完全不同。例如: - `int *p1[5];` 表示一个指针数组,其中每个元素都是一个指向 `int` 类型的指针。 - `int (*p2)[5];` 表示一个指向包含 5 个整数的一维数组的指针。 ### 示例代码 以下是一个完整的代码示例,展示如何使用指针操作二维数组: ```c #include <stdio.h> int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; int (*p)[4] = arr; // p 是指向包含 4 个整数的一维数组的指针 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", *(*(p + i) + j)); } printf("\n"); } return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值