南宫倾梨 发表于 2020-11-21 18:47:33

数组指针

#include<stdio.h>
int main()
{
char a = {
      {
                {'a', 'b'}, {'c', 'd'}, {'e', 'f'}
      },
      {
                {'g', 'h'}, {'i', 'j'}, {'k', 'l'}
      },
      {
                {'m', 'n'}, {'o', 'p'}, {'q', 'r'}
      },
      {
                {'s', 't'}, {'u', 'v'}, {'w', 'x'}
      }
};
char (*pa) = &a;
char (*ppa) = &a

printf("%c\n",*(*(pa+8)+1));
printf("%c",*(*(*(ppa+2)+2)+1));
}






这里数组指针的方括号左右有什么联系嘛,为什么加或减一个方括号就出错了?

风过无痕1989 发表于 2020-11-21 19:58:28

看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号<

南宫倾梨 发表于 2020-11-21 21:01:32

因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = &a;
这两句希望您可以讲解一下,谢谢。

南宫倾梨 发表于 2020-11-21 21:02:11

风过无痕1989 发表于 2020-11-21 19:58
看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号


因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = &a;
这两句希望您可以讲解一下,谢谢。

风过无痕1989 发表于 2020-11-21 22:46:17

南宫倾梨 发表于 2020-11-21 21:01
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = ...

第一句是定义了一个一维指针,它有两个元素,第二句是定义了一个二维指针,它有三行,每行有两个元素
这两句是等价的,都是将字母 g 那个单元的地址赋给指针
*(*(pa+8)+1) 与 *(*(*(ppa+2)+2)+1) 也是等价的,都是指向字母 x,所以,两句输出的都是字母 x

倒戈卸甲 发表于 2020-11-21 22:57:49

这个问题太过复杂,不适合初次接触数组指针的新手

倒戈卸甲 发表于 2020-11-21 23:13:01

本帖最后由 倒戈卸甲 于 2020-11-21 23:25 编辑

南宫倾梨 发表于 2020-11-21 21:02
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa)[ ...

a,a,a,a其实表示同一个地址,这是语法规定。以此为前提。
在这里pa指向一维数组,拿到的是{'g','h'}的地址,指向的也是{'g','h'},因为pa定义时长度为2的一维数组,pa+8会越过8个长度为2的一维数组,指向{'w','x'},那么*(pa+8)指向这个长度为2小数组的首元素'w',*(pa+8)+1就是再向前偏移1位指向'x',*(*(pa+8)+1)就是在此基础上真正拿到x。

倒戈卸甲 发表于 2020-11-21 23:21:44

本帖最后由 倒戈卸甲 于 2020-11-21 23:29 编辑

至于ppa,首先它是一个二维指针数组,指向的是{ {'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个3x2数组,ppa+2本身会越过两个3x2数组指向 { {'s', 't'}, {'u', 'v'}, {'w', 'x'}},因此*(ppa+2)则指向{'s', 't'}, *(ppa+2)+2则指向{'w', 'x'},后面我就不详说了,因为到这里*(ppa+2)+2和上面的pa+8没任何区别,反正后面就是一层层剥开,你暂时领略个大概就行

南宫倾梨 发表于 2020-11-22 16:21:51

倒戈卸甲 发表于 2020-11-21 23:21
至于ppa,首先它是一个二维指针数组,指向的是{ {'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个3x2数组,ppa+2 ...

谢谢,这个明白了
我还有一个问题就是那两个指针为什么指的都是'g'?

倒戈卸甲 发表于 2020-11-22 21:27:27

本帖最后由 倒戈卸甲 于 2020-11-22 21:30 编辑

南宫倾梨 发表于 2020-11-22 16:21
谢谢,这个明白了
我还有一个问题就是那两个指针为什么指的都是'g'?

语法规定,或者说底层的数据结构决定的规则。数组名=数组的地址=数组首元素的地址。也就是我最初的那句话。{{'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个数组元素的地址与它的第一个元素也就是{'g', 'h'}这个数组元素的地址相同。而{'g', 'h'}这个数组元素元素又于它的首元素'g'地址相同。所以两个指针分别指向{{'g', 'h'}, {'i', 'j'}, {'k', 'l'}}和{'g', 'h'}, 但指向了同一个地址,且都和'g'的地址相同。这个是硬性规定,先记住就好。将来你学习到c语言的底层,掌握了数组这个容器的数据结构,自然理解。
页: [1]
查看完整版本: 数组指针