二维数组的地址

1.列表法

int b[n][m]的第一个元素地址为&b[0][0]:

声明 int *p;

         p=&b[0][0];

         *(p+1) 等于b[0][1]

         *(p+i*m+j)就是b[i][j]

        p每次加1,指向下一列的元素,这时p称为列指针。

 

2.行地址法

对二维数组int b[10][20]  每行看做一个整体,每个元素看做一行的一维数组

b是这个一维数组的名字,B[i]就是这个一维数组的第i个元素

b是这个一维数组的首地址,b+i就是第i个元素的地址

 

b[i]实际上是一行元素。它是这一行元素的名称,就是这一行元素的首地址

*(*(b+i)+j)与b[i][j]、*(b+i)[j]相同

 

与b对应的指针的声明为 int (*p)[20];

*(*(b+i)+j)=(i+1)*(j+1);

这样声明指针变量,复制p=b,开始p是第0行地址,p+1就是第一行的地址。p称为行地址。

2.二维数组的指针作为函数的参数

int b[n][m]

int *p 实参应该为&b[0][0]  

访问 *(p+M*i+j)

int(*p)[M] 实参为B或&B[0],函数中访问元素的基本方式*(*(p+i)+j)

在C语言中,二维数组地址和指针有着紧密的联系,以下是相关知识介绍: ### 二维数组名与指针 二维数组名可以看作是一个指向一维数组的指针。以`int arr[3][4]`为例,它可以理解为由3个一维数组(每个一维数组含有4个元素)构成的二维数组二维数组名`arr`代表数组首元素地址,而二维数组的首元素是一维数组`arr[0]`,所以`arr`是`arr[0]`的地址(行指针)。`arr + i`相当于跳过`i`个一维数组后的地址,也就是`arr[i]`的地址,也即`&arr[i]` [^1]。 ### 行指针与列指针 - **行指针**:`arr` 是指向一维数组的指针,也叫行指针。`*(arr + i)` 等同于 `arr[i]`,代表第 `i` 行的首地址。例如,`*arr` 是 `arr[0]`,是第0行的首地址。如果 `arr` 是字符型数组,输出 `*arr` (第一行的首地址)为 `0000`,再输出 `*(arr + 1)` 可能是 `0004` (假设每个元素占1字节,一行有4个元素),这表明 `arr` 是指向一维数组的指针 [^5]。 - **列指针**:`arr[i]` 是第 `i` 行一维数组的数组名,它是一个列指针,指向该行的第一个元素。`arr[i] + j` 是第 `i` 行第 `j` 列元素的地址,`*(arr[i] + j)` 则是该元素的值。同时,`*(*(arr + i) + j)` 也等价于 `arr[i][j]` [^1]。 ### 指针访问二维数组元素示例 ```c #include <stdio.h> int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; // 使用指针访问二维数组元素 for (int i = 0; i < 3; i++) { for (int j = 0; j < 4; j++) { printf("%d ", *(*(arr + i) + j)); } printf("\n"); } return 0; } ``` ### 二维数组作为函数参数与指针 当二维数组作为函数参数传递时,通常使用指向一维数组的指针。例如: ```c #include <stdio.h> // 函数接受一个指向一维数组的指针 void printArray(int (*arr)[4], int rows) { for (int i = 0; i < rows; i++) { for (int j = 0; j < 4; j++) { printf("%d ", *(*(arr + i) + j)); } printf("\n"); } } int main() { int arr[3][4] = { {1, 2, 3, 4}, {5, 6, 7, 8}, {9, 10, 11, 12} }; printArray(arr, 3); return 0; } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值