如何用指向二维数组首行的指针访问第二行?含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
相关产品推荐
相关产品推荐

