c语言结构体和数组指针的区别,结构体数组指针+1和下标+1意义区别?

回复: 48

e5a73b6a7586c690ae7a720f72a4e733.png

ccfb3c64a5000ccc1971125e1fdae7b2.png

20f7beba86b4a360a2108c8a34a4ebf3.png

结构体数组指针+1和下标+1意义区别?

f594032c02af5dff19036f6598e8b26a.png

(209692688)

出0入0汤圆

电梯直达

ac34f29e61779188a50d361fdeae2c1f.png

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 21:58:20

|

只看该作者

8d1228179cec554492e4b5a60a447513.gif

|倒序浏览

|阅读模式

设有结构体:

struct struct_original

{

u8 *a[5];

u8  *b[10];

u8 *c[16];

}

然后由上定义结构体数组:

struct struct_original         *struct1[20]

设有用来计数的变量:

u8 i;

现在我通过程序发现  struct1[1+i]->c  和  (struct1[1]+i)->c  的值是不一样的。

我对此的理解是:struct1[1]当中存放的是是struct1这个结构体数组中第二个成员(因为数组都是从0开始计数)的首地址,+i 以后则还是第二个成员,

只不过是“前进”了i个内存地址后的地址,例如原来struct1当中指向的地址是0x0000 0000,加上5(这里假设i的值是5)了以后变成了0x0000 0005了,并非结构体的第7个成员。

而struct1[1+5]则非常直接了当的是第7个成员的首地址,因为运算实在下标括号内进行的。

这是我的理解,希望能得到高人指点是否正确。我仔细想了一下,感觉又不对,struct1是指针,struct1[0]+1应当是指向第二个成员的首地址也就是struct1[1],但是通

过在stm32上实时演算出的结果又不是这样。

c9855b11766800f758528d1981533e71.png

(209689933)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 22:44:15

来自手机

|

只看该作者

你的理解太匪夷所思

下标怎么就指向第二个元素了

还有你满天飞舞的*,你确定你知道他是什么

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

2dce8a7cf128274dfa7aa4ce203ffeb8.png

(209689888)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 22:45:00

|

只看该作者

“struct1[0]+1应当是指向第二个成员的首地址也就是struct1[1]”这句话是错的。struct1[0]+1应该指向struct1[3]。

c9855b11766800f758528d1981533e71.png

(209689611)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 22:49:37

来自手机

|

只看该作者

hithms 发表于 2014-9-26 22:45

“struct1[0]+1应当是指向第二个成员的首地址也就是struct1[1]”这句话是错的。struct1[0]+1应该指向struct ...

楼主看吧

一个本来想帮你的人

被你的*号们带进坑里了

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

2dce8a7cf128274dfa7aa4ce203ffeb8.png

(209689290)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 22:54:58

|

只看该作者

ab67c3f9ebcabb32e3698f302d5dacea.png

(209688882)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 23:01:46

|

只看该作者

你的数组里面放的地址值确定是连续的吗?应该是数组元素的地址是连续的,但是存放的地址不一定是连续的。  struct1[1+i]->c  和  ((&struct1[1])+i)->c 是相同的

dfdd83a5115062bf76ffbdb7f1b2e593.png

(209685951)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 23:50:37

|

只看该作者

没看懂啊

c9855b11766800f758528d1981533e71.png

(209685685)

出0入0汤圆

4e3a061a6cee689711774664b8e32641.png

发表于 2014-9-26 23:55:03

来自手机

|

只看该作者

hithms 发表于 2014-9-26 22:54

嗯,对。我搞错了。看错了,还以为LZ声明结构体中只有三个指针变量(应该是31个)。假如是三个的话,应该 ...

恭喜再次掉入坑里:)

精华汤圆VIP

{*}

417ed852d27e8c159716eac4e3779f56.gif

2dce8a7cf128274dfa7aa4ce203ffeb8.png

(209684722)

出0入0汤圆

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值