You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用指向二维数组首行的指针访问第二行?含char数组实例

关于二维数组指针跨行访问的问题解答

嘿,这个问题问到点子上了,咱们分场景一步步说清楚:

通用类型二维数组的情况

假设我们有一个普通的二维数组,比如:

int arr[2][5];
int *p = arr[0]; // p指向数组首行的第一个元素

答案是可以通过这个指针访问第二行的元素。

原因是C语言中的二维数组在内存里是连续存储的——首行的所有元素会紧挨着第二行的元素排列,比如arr[0][4]的下一个地址就是arr[1][0]的地址。

你可以通过指针偏移来访问第二行:

  • *(p + 5) 等价于 arr[1][0]
  • p[6] 等价于 arr[1][1](数组下标本质就是指针偏移的语法糖)

不过要注意:这种访问方式虽然语法合法,但必须确保偏移量在数组有效范围内,否则会触发数组越界,导致未定义行为。

字符类型二维数组的场景

针对你举的例子:

char a[2][10];
char *b = a[0];

同样可以通过指针b访问第二行a[1]的元素。

原理和上面一致,a[0]的10个char元素在内存中紧接着a[1]的10个char元素,所以:

  • b + 10 会指向a[1][0]
  • *(b + 10) 就是a[1][0]的值
  • 甚至可以用下标写法b[10]直接访问a[1][0]

额外提个小细节:如果二维字符数组存的是C风格字符串(以'\0'结尾),使用strlen这类字符串函数时,只会计算到a[0]里的'\0'为止,不会自动跨到第二行,但单纯的指针直接访问不受影响。

关键提醒

要区分二维数组和指针数组:如果是char *a[2];这种指针数组,a[0]和a[1]是指向不同内存块的指针,它们的地址不一定连续,这时候就不能通过a[0]的指针偏移访问a[1]指向的内容。但你问题里的是真正的二维数组,所以不存在这个问题。

内容的提问来源于stack exchange,提问作者edmonda7

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 03:40:41