Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么我可以这样做?_C_Pointers - Fatal编程技术网

C 为什么我可以这样做?

C 为什么我可以这样做?,c,pointers,C,Pointers,为什么允许我执行*ptr++=66行,即使=66位似乎不起作用?当我打印*ptr时是7。有人能解释为什么吗?编译器不应该抱怨=66位没有效果吗 *ptr++=66是否基本等同于7=66?您正在增加指针。然后指向b[1]。b[0]的值可能是66。发生的情况是: b[0]被分配一个值66,因为您正在延迟ptr,即您正在执行*ptr,然后执行赋值 指针本身是递增的,即&b[0]++,它变成&b[1] ptr现在指向b[1],即7 换句话说:递增和赋值是在两个完全不同的东西上执行的。由于它是一个后缀增量

为什么允许我执行
*ptr++=66
行,即使
=66
位似乎不起作用?当我打印
*ptr
时是7。有人能解释为什么吗?编译器不应该抱怨
=66
位没有效果吗


*ptr++=66
是否基本等同于
7=66

您正在增加指针。然后指向b[1]。b[0]的值可能是66。

发生的情况是:

  • b[0]
    被分配一个值
    66
    ,因为您正在延迟
    ptr
    ,即您正在执行
    *ptr
    ,然后执行赋值

  • 指针本身是递增的,即
    &b[0]++
    ,它变成
    &b[1]

  • ptr
    现在指向
    b[1]
    ,即
    7


  • 换句话说:递增和赋值是在两个完全不同的东西上执行的。由于它是一个后缀增量,指针在其原始地址接收到一个新值后会递增。

    这个
    ptr++
    称为后增量,这意味着您首先使用
    ptr
    的旧值(覆盖
    5
    ),然后递增
    ptr
    ,然后递增指针。如果要增加指针的值,请使用
    (*ptr)+


    看到这个

    是的,我理解,但是为什么编译器让我分配*ptr++给一个数字,即使它没有效果?5?但是编译器不允许我输入5++=7;我理解*ptr++代码的作用,但是为什么我能把这个表达式赋给一个数字呢?@Sam:你正在解引用
    ptr
    并将66赋给它对应的任何值,但是你在增加指针本身。只是为了逗我笑:试试
    *(++ptr)=99谢谢!因此,等效代码基本上是*ptr=66*ptr++;?这对我来说是有意义的。事实上这没有意义,因为那样的话*ptr将是67。它相当于
    *ptr=66;ptr++
    。这意味着您增加的是指针,而不是指针指向的内容。
    ptr=&b[0]是冗余的;您可以改用
    ptr=buf
    int b[2], *ptr;
    b[0] = 5;
    b[1] = 7;
    
    ptr = &b[0];
    *ptr++ = 66;
    
    printf("%d", *ptr);