*ptr和#x2B;=1和*ptr++;在C中

*ptr和#x2B;=1和*ptr++;在C中,c,pointers,post-increment,C,Pointers,Post Increment,我刚开始学习C,在做一个关于将指针作为函数参数传递给指针的例子时,我发现了一个问题 这是我的示例代码: #include <stdio.h> #include <string.h> #include <stdlib.h> int* allocateIntArray(int* ptr, int size){ if (ptr != NULL){ for (int i = 0; i < size; i++){

我刚开始学习C,在做一个关于将指针作为函数参数传递给指针的例子时,我发现了一个问题

这是我的示例代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int* allocateIntArray(int* ptr, int size){
    if (ptr != NULL){
        for (int i = 0; i < size; i++){
            ptr[i] = i;
        }
    }
    return ptr;
}

void increasePointer(int** ptr){
    if (ptr != NULL){
        *ptr += 1; /* <----------------------------- This is line 16 */
    }
}

int main()
{
    int* p1 = (int*)malloc(sizeof(int)* 10);
    allocateIntArray(p1, 10);

    for (int i = 0; i < 10; i++){
        printf("%d\n", p1[i]);
    }

    increasePointer(&p1);
    printf("%d\n", *p1);
    p1--;
    free(p1);
    fgets(string, sizeof(string), stdin);
    return 0;
}
#包括
#包括
#包括
int*allocateIntArray(int*ptr,int size){
如果(ptr!=NULL){
对于(int i=0;i*ptr+=1;/*差异是由运算符优先级引起的

增量后运算符
++
的优先级高于取消引用运算符
*
。因此
*ptr++
相当于
*(ptr++)
。换句话说,增量后修改的是指针,而不是指针指向的对象


赋值运算符
+=
的优先级低于解引用运算符
*
,因此
*ptr+=1
相当于
(*ptr)+=1。换句话说,赋值运算符修改指针指向的值,而不更改指针本身。

问题中涉及的3个运算符的优先顺序如下:

后期增量
++
>取消引用
*
>分配
+=

有关此主题的更多详细信息,请查看此页

解析表达式时,在某一行上列出的运算符将比在其下一行上列出的任何运算符更紧密地绑定到其参数(好像用括号)。例如,表达式
*p++
被解析为
*(p++)
,而不是
(*p)+


长话短说,为了使用后增量运算符表示此赋值,您需要在解引用运算符中添加括号,以使该运算优先于
++
,如本
(*ptr)+

中所示

让我们再做一次

*ptr   += 1
(*ptr) += 1
*ptr++
*(ptr++)
再加上

*ptr   += 1
(*ptr) += 1
*ptr++
*(ptr++)
  • *ptr+=1
    中,我们增加指针指向的变量的值

  • *ptr++
    中,我们在完成整个语句(代码行)后增加指针,并返回指针指向的变量的引用
后者允许您执行以下操作:

for(int i = 0; i < length; i++)
{
    // Copy value from *src and store it in *dest
    *dest++ = *src++;

    // Keep in mind that the above is equivalent to
    *(dest++) = *(src++);
}
for(int i=0;i
这是一种常用的方法,用于将一个
src
数组复制到另一个
dest
数组中。

非常好的问题

在K&R“C编程语言”“5.1指针和地址”中,我们可以得到这个问题的答案

“一元运算符*和(&B)比算术运算符绑定得更紧密”

“像*和++这样的一元运算符从右向左关联

//它的工作原理类似于*(ptr++)

正确的方法是:

(*ptr)++      //This will work.

*ptr+=1:ptr指向的增量数据。
*ptr++:指向下一个内存位置的增量指针,而不是指针指向的数据。

注意,给定的代码不会编译,因为您没有声明
string
。其他注意事项:1)
allocateInArray
是一个坏名字,因为您似乎
malloc
函数中的数组,但您没有。我建议e> 填充数组
。2)您不使用
allocateInArray
的返回值。我建议您将返回类型更改为
void
。3)不应
if(ptr!=NULL)
函数中的
递增指针
be
if(*ptr!=NULL)
?4)malloc中的强制转换是不必要的。请参见上文Sourav的评论。5)这:
对于(int i=0;i<10;i++){printf(“%d\n”,p1[i]);}
printf(“%d\n”,*p1-;
需要包含在
中,如果(p1!=NULL)
.6)
string.h
未使用。
p+=1
类似于
++p
,而不是
p++
这个问题是在4年前提出的:@ren几乎,但不完全。链接的问题不涉及解引用运算符,这是OP问题的关键。有趣的是,这是目前唯一包含solu的答案“并返回指针指向的变量的引用。”C没有引用。@MilesRout称之为左值可能更准确?但我不知道如何在不添加行话的情况下使用它。对于初学者来说,助记符号是
*p++
*++p
之间的相似性。后者的运算符优先级很清楚,前者的运算符优先级如下。这是我第一次评论St确认溢出。我已经更新了代码的格式。^^谢谢你的建议。
(*ptr)++      //This will work.