【问题标题】:Understanding pointer variable increment了解指针变量增量
【发布时间】:2015-06-08 07:51:15
【问题描述】:

在阅读指针时,我发现指针变量用于指示这样的数组:

char* chrArray;
int* intArray;

之后我发现charArray++intArray++在代码中用来表示charArrayintArray的下一个元素。但到目前为止,我知道 C 中的 char 是 1 个字节,而数组中的 int 是 4 个字节。所以我无法理解增量运算符在这里的行为。谁能解释一下。

【问题讨论】:

  • 没有什么语言比 C 语言(除了汇编......)更能控制内存。有了这种强大的控制权,就需要知道在任何给定位置存储在内存中的内容以及如何处理该值。指针只是变量,但不是保存您认为的正常值,而是将内存地址保存到存储值的位置。当你像上面那样声明指针时,在你为它们分配地址之前,它们什么都没有。正常的例子是int n = 5; int *p = &n; 这里p 保存了n 的地址,其中存储了5 的值。

标签: c pointers increment post-increment


【解决方案1】:

根据C11 标准文档,第 6.5.2.5 章,后缀递增和递减运算符

后缀 ++ 运算符的结果是操作数的值。作为一个副作用, 操作数对象的值递增(即,相应类型的值 1 为 添加到它)。

因此,每当您使用后缀增量运算符时,您都不会添加任何 特定值,而是添加 value 1 类型的使用运算符的操作数。


现在举个例子,

  • chrArray 的类型为 char *。因此,如果我们执行chrArray++,则char [sizeof(char),即1] 类型的值将作为结果添加到chrArray

  • OTOH,intArray 的类型为 int *。因此,如果我们执行intArray++,则int 类型的值[sizeof(int),在32 位平台上为4,可能会有所不同] 将被添加到intArray 作为结果。

基本上,任何类型的指针变量上的后缀自增运算符都指向该类型的下一个元素(提供有效访问)。

【讨论】:

    【解决方案2】:

    这由知道指针类型的编译器处理,因此可以将它存储的地址增加相关大小,无论是 char、int 还是任何其他类型。

    【讨论】:

    • 这意味着对于 char 增量运算符设置指针以指示内存中的下一个字节?对于整数,它在 4 个字节后设置?
    • 通常是的。但是,重要的是要了解指针的 ++ 运算符语义是将地址增加所指向项目的大小。这是在程序编译期间由编译器处理的。
    • 非常感谢。现在说得通了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-08-08
    • 2012-06-11
    • 2013-11-02
    • 2015-08-03
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多