1. ホーム
  2. c

[解決済み] C言語における*ptr += 1と*ptr++の違いについて

2022-08-13 20:43:29

質問

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;
}

問題は16行目で発生します。 *ptr+=1*ptr++ . 期待される結果は、配列全体と 1 という数字ですが *ptr++ を使用すると、結果は0になります。

の間に違いはありますか? +=1++ ? どちらも同じだと思ったのですが。

どのように解決するのですか?

演算子の優先順位による違いです。

ポストインクリメント演算子 ++ はデリファレンス演算子 * . ですから *ptr++ と同じです。 *(ptr++) . 言い換えれば、ポストインクリメントはポインタを修正するのであって、ポインタが指すものを修正するのではありません。

代入演算子 += は、参照解除演算子 * よりも優先順位が低いので *ptr+=1 と同じです。 (*ptr)+=1 . つまり、代入演算子はポインタが指す値を変更するのであって、ポインタそのものを変更するわけではありません。