二维数组和指针的调用

二维数组和指针的调用

二维数组和指针经常用于形参和实参的相互转化或者用于输出二维相互转化(例如用指针调用数组中的元素)。因此我们有许多固定的格式转换,但如果我们不了解其中的原理的话,我们很难熟练掌握运用,就和记物理公式一样只知道公式不知道原理是很难 取得好成绩的。
要理解指针和二维数组的关系我们首先要记住最重要的一点:二数组就是一维数组!!!
我们要学着将二维数组看成一维数组(其实所以的二维数组元素的调用和输出都可以看成一维数组)。
【一维数组】假设一个一维数组为a[3]={1,2,3};其中数组名为a,一维数组的数组名表示的就是数组第一个元素的地址即a= =a[0];a+1则为a[1]的地址。但我们也发现我们也可以对a取地址即&a并且&a= =a[0];两者都代表数组首元素的地址但a+1代表增加了一个数组元素类型所占的内存(sizeof(int)= =4);而&a+1代表增加了整个数组所占的内存。
在这里插入图片描述
【二维数组】假设一个二维数组为b[3][1];二维数组名为b,b数组含有三行元素,b[0],b[1],b[2];我们可以将其看成为三个一维数组的数组名,b[i]= =&b[i][0],因此类比一维数组在调用二维数组的时候该二维数组的首地址即为第一个一维数组的数组名即b[0];而b则和一维数组中的&a类似即b==&b[0];而b[0]= =&b[0][0]所以b==&(&b[0][0]);* b==* (&(&b[0][0]))= =&b[0][0]。所以当我们定义了一个指针变量P我们可以将&b[0][0]赋给p也可以将b[0]或者b赋给p这三者表达的意思都是一样的将二维元素的首地址赋给p。我能也可以发现b+i= = * (b+i)= =&b[i][0]。
在这里插入图片描述
在这里插入图片描述
【常用的转化表达式】假设一个二维数组a[m][n];因为其中a[i]代表为元素a[i][0]的地址所以a[i]+j==&a[i][0]+j==&a[i][j]
又因为a[i]== * (a+1);所以 * (a+1)+j==&a[i][j]并且(
(a+i))[j]= =a[i][j]。我们除了定义一个指针p将数组元素的首地址&a[0][0]赋给p通过p+i * n+j==&a[i][j]调用数组元素;我们也可以把p定义成int()[n]型然后把二维数组名a赋给p,通过((a+1)+j)调用数组函数。
最后有个改错题可以帮助我们理解二维数组和指针的关系
#include <stdio.h>
#define STUD 30 /
最多可能的学生人数 /
#define COURSE 5 /
最多可能的考试科目数 */
void Total(int *pScore, int sum[], float aver[], int m, int n);
void Print(int *pScore, int sum[], float aver[], int m, int n);
int main()
{
int i, j, m, n, score[STUD][COURSE], sum[STUD];
float aver[STUD];
printf(“How many students?”);
scanf("%d", &m);
printf(“How many courses?”);
scanf("%d", &n);
printf(“Input scores:\n”);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
scanf("%d", &score[i][j]);
}
}
Total(*score, sum, aver, m, n);
Print(*score, sum, aver, m, n);
return 0;
}
void Total(int *pScore, int sum[], float aver[], int m, int n)
{
int i, j;
for (i = 0; i < m; i++)
{
sum[i] = 0;
for (j = 0; j < n; j++)
{
sum[i] = sum[i] + pScore[i * n + j];
}
aver[i] = (float) sum[i] / n;
}
}
void Print(int *pScore, int sum[], float aver[], int m, int n)
{
int i, j;
printf(“Result:\n”);
for (i = 0; i < m; i++)
{
for (j = 0; j < n; j++)
{
printf("%4d\t", pScore[i * n + j]);
}
printf("%5d\t%6.1f\n", sum[i], aver[i]);
}
}

二维数组函数指针参数是指将二维数组作为参数传递给函数,并且该函数的参数是一个函数指针。函数指针是指向函数的指针变量,可以用来调用特定的函数。 以下是一个示例代码,演示了如何传递二维数组和函数指针参数: ```c #include <stdio.h> // 函数指针类型定义 typedef void (*FuncPtr)(int, int); // 函数使用二维数组和函数指针作为参数 void processArray(int arr[][3], int rows, int cols, FuncPtr func) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { // 调用函数指针所指向的函数 func(arr[i][j], i); } } } // 示例函数,打印数组元素的值和索引 void printElement(int value, int index) { printf("Element [%d][%d]: %d\n", index / 3, index % 3, value); } int main() { int arr[2][3] = {{1, 2, 3}, {4, 5, 6}}; // 调用 processArray 函数,并传递二维数组和函数指针参数 processArray(arr, 2, 3, printElement); return 0; } ``` 在上述代码中,`processArray` 函数接受一个二维数组 `arr`,以及行数和列数作为参数,同时还接受一个函数指针 `func`。在 `processArray` 函数中,使用嵌套的循环遍历二维数组,并通过调用函数指针所指向的函数来处理数组元素。 在 `main` 函数中,定义了一个二维数组 `arr`,然后调用 `processArray` 函数,并将 `arr`、行数、列数以及 `printElement` 函数的函数指针作为参数传递进去。`printElement` 函数用于打印数组元素的值和索引。 运行上述代码,会输出如下结果: ``` Element [0][0]: 1 Element [0][1]: 2 Element [0][2]: 3 Element [1][0]: 4 Element [1][1]: 5 Element [1][2]: 6 ``` 这样,我们就成功地将二维数组和函数指针作为参数传递给了函数,并在函数内部进行了处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值