自作関数の引数となっているポインタ変数宣言にconstをつけてみる その2

ソーラー「さてさて先ほどのプログラムでは


自作関数の引数がconst int *ptxになっていたね。」



#include <stdio.h>


void function(const int *ptx) {

//🌞自作関数の引数がconst int *ptxになっています。

int b=2;


ptx=&b;


printf("%d\n", *ptx);


return;

}


int main(void) {


int a=1;


function(&a);

//🌞自作関数の引数const int *ptxに変数aのアドレスaを代入しました


return 0;

}


(EAZY IDECの場合)


コンパイル結果

2


(Visual studioの場合)


ビルド実行結果

2


ソーラー「そして


main関数内で


function(&a);

が実行されると


const int *ptxにアドレス&aが代入された状態


const int *ptx=&a;


となります。


このとき


constによって変更されないことになるのは


*ptxに格納されている数値ではなく


アドレス&aの番号の付いたメモリに格納されている数値


つまり


変数aという名前の付いたメモリに格納されている数値でした。


そう


constによって変更されないことになるのは


変数aという名前の付いたメモリに格納されている数値なのです。


ですので

自作関数の定義を


void function(const int *ptx) {


int b=2;


ptx=&b;


printf("%d\n", *ptx);


return;

}


void function(const int *ptx) {


*ptx=2;


printf("%d\n", *ptx);


return;

}


変更すると


コンパイルエラーが表示されます。


solarplexuss「なんでぇ??」


ソーラー「実際に自作関数の定義を変更して


プログラムを実行してみましょう。


#include <stdio.h>


void function(const int *ptx) {


*ptx=2;


printf("%d\n", *ptx);


return;

}


int main(void) {


int a=1;


function(&a);

//🌞自作関数の引数const int *ptxに変数aのアドレスaを代入しました


return 0;

}


(EAZY IDECの場合)


コンパイル結果

ファイル「C:/Users/solarplexuss/AppData/Local/EasyIDEC/project/hhhhhhhh/main.c」の

「5行目」で記述エラーを発見しました。

警告

assignment of read-only location



(Visual studioの場合)


ビルド実行結果


エラー (アクティブ) E0137 式は変更可能な左辺値である必要があります

エラー C3892 'ptx': const である変数へは割り当てることはできません


solarplexuss「コンパイルエラーがでてきた?」


ソーラー「main関数内で


int a=1;


function(&a);


が実行されると


const int *ptxにアドレス&aが代入された状態


const int *ptx=&a;


となります。


このとき


constにより


変数aに格納された値は1から変更されないようになっています。


ここまではいいんですが


自作関数の定義が


void function(const int *ptx) {


*ptx=2;


printf("%d\n", *ptx);


return;

}


となっていることに注目してほしいな。」


solarplexuss「にゃお~?」


ソーラー「

注目ポイントは


*ptx=2;


だね。


function(&a);


が実行されることにより


const int *ptx=&a;


が実行されると


先のエピソードでも考察したように


変数aに格納された値は1から変更されないようになります。


const int *ptx=&a;


が実行されると


ポインタ変数ptxが生成され


ポインタ変数ptxには変数aのアドレス&aが代入されているので


*ptxは変数aのメモリにアクセスして


変数aのメモリに格納されている数値を変更することが


できるようになります。


もちろん


このときの


*ptxは変数aのメモリに格納されている数値1をあらわしてもいます。


この状態で


*ptx=2;


を実行するということは


変数aのメモリに格納されている数値を


1から


2に変更することになるわけです。


もちろん


constにより


変数aに格納されている値は


1のまま変更されないことになっているので


*ptx=2;


を実行しようとすると


このプログラムのように


コンパイルエラーがでるというわけなのさ(^_-)-☆」


solarplexuss「なぁにぃ~」


ソーラー「だから


constにより


変数aに格納されている値は変更されないように設定されているので


変数aに格納されている値にアクセスして格納されている数値を


変更するような


命令文を記述しようとすると


コンパイルエラーが表示されてしまうんだね。」






















  • Twitterで共有
  • Facebookで共有
  • はてなブックマークでブックマーク

作者を応援しよう!

ハートをクリックで、簡単に応援の気持ちを伝えられます。(ログインが必要です)

応援したユーザー

応援すると応援コメントも書けます