取消引用多维数组名称和指针算术

发布于 2024-12-19 15:59:28 字数 432 浏览 0 评论 0原文

我有这个多维数组:

char marr[][3] = {{"abc"},{"def"}};

现在,如果我们遇到定义的表达式 *marr (ISO/IEC 9899:1999),它会说(我引用)

如果操作数的类型为“指向类型的指针”,则结果的类型为“type”

并且在该表达式中,marr 衰减为指向其第一个元素的指针,在本例中是指向数组的指针,因此我们返回“type” ' 当我们有表达式 *marr 时,大小为 3 的数组。所以我的问题是,为什么当我们执行 (*marr) + 1 时,我们仅向地址添加 1 个字节,而不是数组大小的 3 个字节。

请原谅我的无知,我不是一个很聪明的人,有时我会被这样的琐事困住。

谢谢您的宝贵时间。

I have this multi-dimensional array:

char marr[][3] = {{"abc"},{"def"}};

Now if we encounter the expression *marr by definition (ISO/IEC 9899:1999) it says (and I quote)

If the operand has type 'pointer to type', the result has type 'type'

and we have in that expression that marr decays to a pointer to his first element which in this case is a pointer to an array so we get back 'type' array of size 3 when we we have the expression *marr. So my question is why when we do (*marr) + 1 we add 1 byte only to the address instead of 3 which is the size of the array.

Excuse my ignorance I am not a very bright person I get stuck sometimes on trivial things like this.

Thank you for your time.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

对风讲故事 2024-12-26 15:59:28

递增 (*marr) 向前移动 1 个字节的原因是 *marr 引用了 char[3]{" abc"}.如果您还不知道:

*marr == marr[0] == &marr[0][0]
(*marr) + 1 == &marr[0][1]

如果您只有 char single_array[3] = {"abc"};,您预计 single_array + 1 会前进多远在记忆中?向右 1 个字节,而不是 3 个字节,因为该数组的类型是 char 并且 sizeof(char) 是 1。

如果您执行了 *(marr + 1)< /code>,那么您将引用 marr[1],您可以预期它距离 3 个字节。 marr + 1 的类型为 char[][3],增量大小为 sizeof(char[3])

上面两个示例的主要区别在于:

  • 第一个示例取消引用 char[3],然后递增,因此增量大小为 sizeof(char)。
  • 第二种是递增 char[][3],因此增量大小为 sizeof(char[3]),然后取消引用。

The reason why incrementing (*marr) moves forward 1 byte is because *marr refers to a char[3], {"abc"}. If you don't already know:

*marr == marr[0] == &marr[0][0]
(*marr) + 1 == &marr[0][1]

If you had just char single_array[3] = {"abc"};, how far would you expect single_array + 1 to move forward in memory? 1 byte right, not 3, since the type of this array is char and sizeof(char) is 1.

If you did *(marr + 1), then you would be referring to marr[1], which you can then expect to be 3 bytes away. marr + 1 is of type char[][3], the increment size is sizeof(char[3]).

The key difference about the two examples above is that:

  • The first is dereferenced to a char[3], and then incremented, therefore the increment size is sizeof(char).
  • The second is incrementing a char[][3], therefore the increment size is sizeof(char[3]), and then dereferencing.
吹泡泡o 2024-12-26 15:59:28

它加一,因为类型是 char(1 个字节)。就像:

char *p = 0x00;
++p; /* is now 0x01 */

当您取消引用 char [][] 时,它将在表达式中用作 char *

要加 3,您需要先进行算术,然后取消引用:

*(marr+1)

您正在做:

(*marr)+1

首先取消引用。

It adds one because the type is char (1 byte). Just like:

char *p = 0x00;
++p; /* is now 0x01 */

When you dereference a char [][] it will be used as char * in an expression.

To add 3, you need to do the arithmetic first and then dereference:

*(marr+1)

You were doing:

(*marr)+1

which dereferences first.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文