我刚刚开始学习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;
}

当我将*ptr+=1修改为*ptr++时,问题出现在第16行.预期的结果应该是整个数组和数字1,但是当我使用*ptr++时,结果是0.

+=1++之间有区别吗?我以为他们俩是一样的.

推荐答案

这种差异是由运算符优先级造成的.

后增量运算符++具有比解引用运算符*更高的优先级.所以一百零二等于一百零三.换句话说,POST增量修改的是指针,而不是它所指向的内容.

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

C++相关问答推荐

try 使用libusb控制音量时LIBUSB_WRIGHT_PIPE

intellisense不工作,甚至已经下载了c/c++扩展

什么C代码将确定打开的套接字正在使用的网络适配器?

如何正确地索引C中的 struct 指针数组?

创建一个fork导致fget无限地重新读取文件

如何将字符串传递给函数并返回在C中更改的相同字符串?

是否可以使用指针算法在不对齐的情况下在 struct 中相同类型的字段的连续序列之间移动?

是否需要包括<;errno.h>;才能使用perror?

如何使用唯一数字对整型进行分区

在vfork()之后,链接器如何在不 destruct 父内存的情况下解析execve()?

我在反转双向链表时遇到问题

用C++构建和使用DLL的困惑

如果格式字符串的内存与printf的一个参数共享,会发生什么情况?

为什么编译器不能简单地将数据从EDI转移到EAX?

GetText不适用于包含国际字符的帐户名称

*S=0;正在优化中.可能是GCC 13号虫?或者是一些不明确的行为?

与外部SPI闪存通信时是否应禁用中断?

Malloc和对齐

按字典顺序打印具有给定字符的所有可能字符串

`%%的sscanf无法按预期工作