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

使用指针操作二维数组的代码疑问:数组名与指针的差异

二维数组指针与普通char指针的核心差异解析

先明确最关键的一点:你的代码里char* ptr = a;是类型不匹配的错误赋值,这也是所有困惑的根源。下面拆解两个表达式的本质:

1. 分析*(*(a + 1) + 1)

char a[3][10]是包含3个元素的数组,每个元素是长度为10的char数组。数组名a在表达式中会隐式转换为char (*)[10]类型(指向长度为10的char数组的指针):

  • a + 1:指针运算步长为sizeof(char[10])(10字节),因此a+1指向数组第2个元素a[1](即存储"Zied"的子数组)
  • *(a + 1):解引用后得到a[1],这是一个char数组,再次隐式转换为char*类型,指向a[1][0](字符'Z')
  • *(a + 1) + 1:char*类型指针加1,步长1字节,指向a[1][1](字符'i')
  • *(*(a + 1) + 1):解引用得到字符'i',这就是变量c的值。

2. 分析*(ptr + 1)+1

ptr被错误声明为char*,虽然它存储了a的起始地址,但类型完全不同:

  • ptr + 1:char*类型指针加1,步长1字节,指向a[0][1](字符'a')
  • *(ptr + 1):解引用得到字符'a',它的ASCII值为97
  • *(ptr + 1)+1:这是数值加法(char本质是整数类型),97+1=98,对应字符'b',所以变量r的值是'b',和c完全无关。

为什么a和ptr不类似?

  • a的本质是二维数组名,转换后的指针是指向数组的指针(char (*)[10]),指针运算步长是整个子数组的大小(10字节)
  • ptr是指向单个char的指针(char*),指针运算步长是1字节
  • 更关键的是:*(ptr +1)得到的是char类型的数值,而非指针,所以后面的+1是数值运算,不是指针偏移。

如果想让ptr和a行为一致,应声明为:

char (*ptr)[10] = a;

此时*(*(ptr +1)+1)就会和*(*(a +1)+1)完全等价,得到字符'i'。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 02:47:22