万千只cnm 发表于 2020-12-14 01:59:34

数组指针

小甲鱼课后作业;
p指针变量指向整个数组,
*(*(p+1)-6)
这里两个*什么意思呀{:5_104:}
一直没搞懂,大佬帮帮我






#include <stdio.h>

int main()
{
      int array = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
      int (*p) = &array;

      printf("%d\n", *(*(p+1)-6));

      return 0;
}

2302855560 发表于 2020-12-14 09:01:34

两次间访,第一次将行指针转化成列指针,再将 列指针 表达出来

风过无痕1989 发表于 2020-12-14 09:13:15

你这个指针定义有问题,越界了,所以才用 -6 将指针拉回来。

(*p) 这样的定义,一般是针对二维数组而言,表明它拥有10个元素,p + i(注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行,换句话说,就是将第 i 行的首地址赋给指针,*(p + i)+ j 就是指针指向了第 i 行的第 j 个元素,然后外面再用一个 * 表示取 *(p + i)+ j 这个地址的元素值,即 *(*(p + i)+ j )

万千只cnm 发表于 2020-12-14 11:04:08

2302855560 发表于 2020-12-14 09:01
两次间访,第一次将行指针转化成列指针,再将 列指针 表达出来

不是线性的嘛{:7_119:}

万千只cnm 发表于 2020-12-14 11:08:15

风过无痕1989 发表于 2020-12-14 09:13
你这个指针定义有问题,越界了,所以才用 -6 将指针拉回来。

(*p) 这样的定义,一般是针对二维数组 ...

“p + i(注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行”
这句话什么意思呀,没搞明白,{:10_324:}
*取址取的是什么呢

风过无痕1989 发表于 2020-12-14 11:57:52

万千只cnm 发表于 2020-12-14 11:08
“p + i(注意是字母 i ,不是数字 1 ),就是让指针指向 i 行,*(p + i) 就是指向第 i 行”
这句话什 ...

int (*p) = a;

1) p 指向数组 a 的开头,也即第 0 行;p + 1 前进一行,指向第 1 行。

2) *(p + 1) 表示取地址上的数据,也就是整个第 1 行数据。注意是一行数据,是多个数据,不是第 1 行中的第 0 个元素。

3) *(p + 1) + 1 表示第 1 行第 1 个元素的地址。如何理解呢?

*(p + 1) 单独使用时表示的是第 1 行数据,放在表达式中会被转换为第 1 行数据的首地址,也就是第 1 行第 0 个元素的地址,因为使用整行数据没有实际的含义,编译器遇到这种情况都会转换为指向该行第 0 个元素的指针;

4) *(*(p + 1) + 1)表示第 1 行第 1 个元素的值。很明显,增加一个 * 表示取地址上的数据。

5) 上面的明白了,我们再来看对于第 i 行第 j 列,即 a[ i ][ j ] 列的表示就可以写成:*(p + i) + j,要取这个单元的元素值,就再在前面加一个 * 号:*(*(p + i) + j)

万千只cnm 发表于 2020-12-14 13:15:43

风过无痕1989 发表于 2020-12-14 11:57
int (*p) = a;

1) p 指向数组 a 的开头,也即第 0 行;p + 1 前进一行,指向第 1 行。


哦哦 谢谢
那是不是p也可以换成数组名
--》a==*(*(a+i)+j)

风过无痕1989 发表于 2020-12-14 13:56:48

万千只cnm 发表于 2020-12-14 13:15
哦哦 谢谢
那是不是p也可以换成数组名
--》a==*(*(a+i)+j)

对的

万千只cnm 发表于 2020-12-14 14:19:48

风过无痕1989 发表于 2020-12-14 13:56
对的

ok谢谢
页: [1]
查看完整版本: 数组指针