二维数组的地址

  对于一维数组而言,例如int a[4] = {1,3,5,7};a指向首元素a[0]的地址,即&a[0],而不是首元素存储的内容1。而对于二维数组而言无非就是嵌套定义。

  设一个数组的定义:int a[3][4] = {{1,3,5,7},{9,11,13,15},{17,19,21,23}};

  a代表二维数组首元素的地址,该首元素不是一个整型变量,而是由4个整型元素所组成的一维数组{1,3,5,7},即指向首元素——

数组a[0]的地址。

  a[0]则指向数组{1,3,5,7}的首元素地址是a[0][0]的地址,也就是&a[0][0]。

 

参考《C++程序设计(谭浩强)》p180,p182

在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; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值