数组指针
#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));
}
这里数组指针的方括号左右有什么联系嘛,为什么加或减一个方括号就出错了?
看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号< 因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = &a;
这两句希望您可以讲解一下,谢谢。
风过无痕1989 发表于 2020-11-21 19:58
看不明白你的意思,请确认:花括号 {,中括号 [,圆括号(,尖括号
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = &a;
这两句希望您可以讲解一下,谢谢。 南宫倾梨 发表于 2020-11-21 21:01
因为很多人读括号的方式都不一样嘛,我就用形状来描述了
char (*pa) = &a;
char (*ppa) = ...
第一句是定义了一个一维指针,它有两个元素,第二句是定义了一个二维指针,它有三行,每行有两个元素
这两句是等价的,都是将字母 g 那个单元的地址赋给指针
*(*(pa+8)+1) 与 *(*(*(ppa+2)+2)+1) 也是等价的,都是指向字母 x,所以,两句输出的都是字母 x 这个问题太过复杂,不适合初次接触数组指针的新手 本帖最后由 倒戈卸甲 于 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: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-21 23:21
至于ppa,首先它是一个二维指针数组,指向的是{ {'g', 'h'}, {'i', 'j'}, {'k', 'l'} }这个3x2数组,ppa+2 ...
谢谢,这个明白了
我还有一个问题就是那两个指针为什么指的都是'g'? 本帖最后由 倒戈卸甲 于 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]