C++ C++;指针偏移量得到平方

C++ C++;指针偏移量得到平方,c++,pointers,offset,C++,Pointers,Offset,我有一个名为“tod”的数据类型,我用它创建数组。要在函数内部(使用指针)在这种类型的元素之间迭代,我想使用偏移量。但是,此偏移量在操作过程中得到平方: tod theTime[] = { {12,0,0, "noon"}, {0,0,0, "midnight"}, {11,30,0, "lunch time"}, {18,45,0, "supper time"}, {23,59,59, "bed time"} }; auto tsize = sizeof(tod); auto p1 = &am

我有一个名为“tod”的数据类型,我用它创建数组。要在函数内部(使用指针)在这种类型的元素之间迭代,我想使用偏移量。但是,此偏移量在操作过程中得到平方:

tod theTime[] = { {12,0,0, "noon"}, {0,0,0, "midnight"}, {11,30,0, "lunch time"}, {18,45,0, "supper time"}, {23,59,59, "bed time"} };
auto tsize = sizeof(tod);
auto p1 = &theTime[0];
auto p2 = &theTime[0] + tsize;
cout << "size of tod = " << tsize << endl;
cout << "p1 = " << p1 << endl;
cout << "p2 = " << p2 << endl;

两个十六进制值之间的差值降到0x790,即1936(十进制)和44^2。这是怎么发生的?有人请帮忙。

你误解了:

如果指针p指向数组的第i个元素,则表达式p+n、n+p和p-n是分别指向同一数组的i+n、i+n和i-n元素的相同类型的指针


e、 g.
时间[0]+1
将返回指向数组第二个元素的指针
时间
;然后
&时间[0]+tsize
将尝试返回指向
tsize+1
th元素的指针(请注意,它超出了界限并导致UB)。这就是为什么您得到了
1936
,即
44*44

向指针添加一个整数意味着按所指向对象的单位数前进(而不是您似乎假设的字节数)<代码>&时间[0]+1会给你
&时间[1]
;您可能听说过
a[b]
相当于
*(a+b)
tsize=sizeof(tod)=44
。。因此,
时间中每个元素的大小为44。。因此
&arr[0]+44
实际上与
addressof(arr)+(tsize*sizeof(eachElement))
相同。由于每个元素的大小是44,并且您要求转到第44个元素,因此您得到
44*44
。你的数组不包含那么多元素,所以没有定义行为。我真的想知道这是怎么回事。不是所有的关于C或C++中的指针的教程、教科书和底漆都清楚地说明它们是以它们指向的对象为单位来操作的,而不是字节?“如果不学这个,人们怎么能学习指针呢?”埃里克·普斯皮奇尔很遗憾,有相当多的教程说“指针是整数”@M.M,这确实是我的误解。谢谢你,先生。你救了我的命。
size of tod = 44
p1 = 0x7ffd3e3b0bf0
p2 = 0x7ffd3e3b1380