如何理解这个指向C中数据结构的指针?

马西莫·西蒙尼

我有这段代码,我想弄清楚第二行代码的作用。

static int table [][4]= {{1,2,3,4},{2,3,4,5},{3,4,5,6}};
int valore = *(*(table+2)+1);
printf("%d",valore);

我对 C 中的指针有基本的了解,你能解释一下第二行代码是做什么的吗?

埃里克·波斯皮希尔

table是 3 个 4 的数组int

在表达式中使用数组时,它会被转换为指向其第一个元素的指针,除非:

  • 它是 的操作数sizeof
  • 它是一元的操作数&
  • 它是用于初始化数组的字符串文字。

所以,在*(*(table+2)+1)table被转换成一个指针到它的第一个元素,从而产生&table[0]然后我们有:

*(*(&table[0]+2)+1)

接下来,我们有加法&table[0] + 2这使用指针算法。将整数添加到指针(到数组中)将指针向后或向前移动多个元素。因此&table[0] + 2产生一个指向 的指针table[2],即&table[2]然后我们有:

*(*(&table[2])+1)

不再需要内括号,所以我们有:

*(*&table[2]+1)

然后* &table[2]&table[2]指向的东西,这意味着它是table[2]

*(table[2] + 1)

由于table是 3 个 4的数组int,因此table[2]4的数组int由于它是一个数组,它被转换为指向其第一个元素的指针,产生&table[2][0]

*(&table[2][0] + 1)

现在我们又有了指针算法。&table[2][0]是一个指向数组元素 0 的指针table[2],所以加 1 产生一个指向元素 1 的指针&table[2][1]

*(&table[2][1])

同样,我们有不再需要的括号:

*&table[2][1]

最后,* &table[2][1]&table[2][1]指向的东西,所以它只是:

table[2][1]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章