使用指针操作二维数组的代码疑问:数组名与指针的差异
二维数组指针与普通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
相关产品推荐
相关产品推荐

