【问题标题】:Pointers in C — adding 1C中的指针——加1
【发布时间】:2013-04-21 23:46:32
【问题描述】:

我有一个关于指针的问题。我开始掌握这个概念,但这段特殊的代码正在威胁这种理解,我只想澄清它。

请注意“B”行,即printf("ptr + %d = %d\n",i, *ptr++); /*<--- B*/

我的印象是,由于*ptr 被初始化为&my_array[0],然后*ptr++(这将转换为“存储在ptr 中的地址中的任何内容,添加一个”)将打印out 23,即my_array[1] 处的值。

然而,它会打印出my_array[0] 的值,即1

我很困惑++ 是否添加到地址本身(例如,1004 变为 1005),并且由于整数占用大约 4 个字节的空间,它会落入my_array[0] 的范围内(因为该值 1 将占用地址 1001、1002、1003、1004,并且由于 my_array[0] 从 1001 开始并且仅上升到 1002,因此 *ptr++ 仍将打印出 my_array[0],即 @987654334 @)...

或者...

*ptr++ 是否从my_array[0](也就是*ptr)变成my_array[1]*ptr++,这是我最初的想法。

基本上,请解释一下*ptr++ 对这个程序的具体作用。请向我解释一下,就好像我是一个五岁的孩子一样。

非常感谢,代码如下:

#include <stdio.h>

int my_array[] = { 1, 23, 17, 4, -5, 100 };
int *ptr;

int main(void)  
{ 
    int i;
    ptr = &my_array[0];     /* point our pointer to the first
                                  element of the array */
    printf("\n\n");
    for (i = 0; i < 6; i++)
    {
        printf("my_array[%d] = %d   ", i, my_array[i]);   /*<-- A */
        printf("ptr + %d = %d\n", i, *ptr++);   /*<--- B*/
    }
    return 0;
}

【问题讨论】:

    标签: c arrays pointers printf


    【解决方案1】:

    改变这个: printf("ptr + %d = %d\n",i, *ptr++); /*&lt;--- B*/

    对此: printf("ptr + %d = %d\n",i, *(++ptr)); /*&lt;--- B*/

    如果使用后缀版本的自增运算符,则自增前的对象的值由表达式按值返回。前缀增量运算符(此答案中的第二组代码使用)将通过引用返回增量对象。

    【讨论】:

    • +1 用于正确描述 postfix 的实际工作方式。老实说,令人惊讶的是有多少人认为增量发生在 语句 之后,而不是您如何描述它,返回先验值。这是用 C++ 等语言实现它们最昂贵的原因之一,因为必须制作状态的临时副本。
    • 所以*ptr++在printf之后递增,*(++ptr)在printf之前递增,打印出修改后的值。
    • 而 *++ptr 将与 *(++ptr) 相同。谢谢!
    • 出于您的目的,这就是行为的样子,但更准确地说,表达式 *(ptr++) 返回由未递增的 *ptr 和表达式 *(++ptr) 指向的对象的副本通过引用返回递增的*ptr 所指向的对象。
    • 在函数调用之前有一个序列点,因此在进行函数调用之前,printf() 和任何函数的参数都会被完全评估,包括诸如增量之类的副作用。您不能依赖调用中参数的评估顺序(官方)。函数返回时还有另一个序列点。
    【解决方案2】:

    *ptr++ 将在 printf 之后递增。你应该使用 *(++p)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-12-19
      • 2018-05-27
      • 2021-08-14
      • 1970-01-01
      • 2011-04-24
      • 2011-05-19
      • 2021-12-31
      • 1970-01-01
      相关资源
      最近更新 更多