次のコードは ideone では問題なく動作しますが、codeblocks IDE で実行時エラーが発生します。IDE が壊れていますか、それともプログラミング言語固有の問題がありますか?
#include<stdio.h>
int main(){
int *pointer;
int num = 45;
*pointer = num;
printf("pointer points to value %d", *pointer);
return 0;
}
これを交換
*pointer = num;
に
pointer = #
ポインターは、値を割り当てる前にメモリ空間を指す必要があります。
この方法でポインターを定義すると、次のようになります。
int *pointer;
これは、ポインターを定義したことを意味しますが、ポインターはまだメモリ空間を指していません。また、ポインターをメモリ空間を指すことなく直接使用すると (コードで行ったように)、未定義の動作が発生します。
ポインタをメモリ空間に向けるには、次のいずれかの方法を使用できます。
1) 静的メモリを指す
int num;
int *pointer = #
num は、静的として定義された int です。したがって、ポインタは num メモリを指すことができます
2) 動的メモリを指す
int *pointer = malloc(sizeof(int));
ポインタは動的メモリを指している可能性があります。動的メモリを割り当てることができmalloc()、メモリが役に立たなくなったときにメモリを解放できますfree(pointer)
まず、「int *pointer」でポインタを定義しました。
次に、「*pointer = num」を使用して間接アクセスを実現しようとします—ポインター「pointer」が指すメモリ空間にnumの値を割り当てます。
よし、ここで問題だ!コードから、ポインターを定義しただけで、メモリ空間を指していません。それをせずに間接的なアクセスを行うことは非常に危険です。したがって、実行時エラーが表示されます。
ここで、「int value;pointer = &value;」を追加する必要があります。あなたのコードに。ポインター「ポインター」が「値」を指すようにします。また、間接アクセス "*pointer = num" を介して "num" を "value" に割り当てることができます。
私の意見では、ポインターを学習するときは、定義と間接アクセスを区別する必要があります。
私は英語が苦手な人です。これは、スタック オーバーフローに関する私の最初の回答です。私の答えがお役に立てば幸いです。ありがとうございました。
ポインターは値ではなくアドレスを保持することになっているため、num のアドレスをポインターに割り当てます。ポインターの詳細については、こちらをご覧ください
pointer = #
ポインターを介して変数の値を変更する
*pointer = 11;
まず、ポイントしようとしているポインタを初期化してから、それを使用してポイントされた値を変更する必要があります.. as ...
pointer=#
ポインターを使用して、ポインターが指している値を変更またはアクセスします。