[解決済み] 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
. つまり、代入演算子はポインタが指す値を変更するのであって、ポインタそのものを変更するわけではありません。
関連
-
#137: 式は変更可能なlvalueでなければならない問題 // 文字列配列の代入問題
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] static_cast, dynamic_cast, const_cast, reinterpret_cast はいつ使うべきですか?
-
[解決済み] スマートポインターとは何ですか?
-
[解決済み] const int*、const int * const、int const *の違いは何ですか?
-
[解決済み] ++iとi++の違いは何ですか?
-
[解決済み] mallocとcallocの違い?
-
[解決済み] printfにおけるdoubleの正しい書式指定子
-
[解決済み] C言語のi++と++iに性能差はあるのでしょうか?
-
[解決済み】定義と宣言の違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
警告:代入がキャストなしで整数からポインタを作成する場合の修正方法に関する警告
-
警告:符号付き整数式と符号なし整数式の比較 [-Wsign-compare]
-
[解決済み] C言語でchar配列をコピーする方法は?
-
[解決済み] ソケットアクセプト - "開かれているファイルが多すぎる"
-
[解決済み] Cプリプロセッサはなぜ "linux "という単語を定数 "1 "と解釈するのですか?
-
[解決済み] 演算子 *, /, +, -, % を使わずに 3 で割る。
-
[解決済み] C言語でオブジェクト指向のコードを書くとしたら、どのようにすればよいのでしょうか?[クローズド]
-
[解決済み] なぜsizeof(x++)はxをインクリメントしないのですか?
-
[解決済み] なぜalloca()の使用はグッドプラクティスとみなされないのでしょうか?
-
[解決済み] ストラクチャーとユニオンの違い