beatleさんとsoftya(ソフト屋) さんすいませんでした。
コードは上書きしてしまっていたので確かめようも無いですが、
おそらく安定しないと思い込んだ原因はポインタだったのだろうと思います。
そしてconstを良くわかっていないことが悪化を招いたのでしょう。
(そのあたりの知識がうやむやだったので、対照実験ではないのに
そうであると思い込んでコードを書いた結果、安定しなかったのだろうと思います。
そのように考えると勘違いの説明がつくようです。)
コード:
#include<stdio.h>
int main(){
int a = 1;
const int * b = &a;
a = 10;
return 0;
}
constに関して判らなかったのがこのようなコードで、
私が*bにaを代入して考えていたからです。
そのため変数aが変化した場合「エラーが出ないのはおかしい」
と大間違いをしでかしたわけです。(*bが定数ならaも同様と思っていたのです。)
(aの中身へのアクセスが可能な経路が2つあり、一方が
読み取りしかできないわけですよね。DVD-Rに似ている気がします。)
そこにポインタのこのようなミスが混じってしまったので
余計にわけが判らなくなったんだと思います。実際に詰まったコードではないですが
一応張ります。
次の場合で言えば*bを変えたのにaが変わらないことと
constで修飾した*bが変化してることが原因です。
*b(もしくはb)は変わっていけないと思ってますし、変われば
a(もしくは&a)も変わるのではないか、と思うのです。
一応*bにconstがかかっていると思います。bは変わりました。
(これは今もわからないです)
コード:
#include<stdio.h>
int main(){
int a = 1;
int const* b = &a;
printf("a = %d,*b = %d\n",a,*b);
*b++;//*b = 10;ではerror・・・だからインクリメントがいけない?
printf("a = %d,*b = %d\n",a,*b);
return 0;
}
これにインクリメントがほんのり絡んだりします。
インクリメントで「constで修飾されている」というエラーが出るコードもあれば
「++には左辺が必要」というエラーが出ることも
(この場合、新たに代入を試みるとconstで修飾されている、と言われます。)、
もしくは上のコードのように
定数化したつもりでも数字が変わるコードもある。という3パターンが今までありました。
(いつどのエラーが出るか、何故出るか、わかりません。)
<想定と実際の結果が違うところをコメントで>
コメントアウトではないですが一応自分が示すべきと思ったことを
今回意識して、できる限り書いたつもりです。
<constは静的な値として扱われる場合と単なるReadOnlyを強要する機能
として扱われる場合があります>
constが使われる場面も静的・動的のことも詳しく知っているわけではないですが、
staticやローカル変数のように他ファイルから直接使用されない(だったはず・・・)
ようにする目的の場合と
変えたくない値が変わってしまうのを防ぐ目的の二つということですか。
<figも*bも個別のメモリ領域を持っており~>
そのように考えていました。それが変わり、
ある物を指す矢印が2本存在し、1本が読み取りしかできないといったイメージです。
<const変数は四則演算には使えますよ。>
そのとおりですよね。何で私はこんなこと書いたんでしょう。
計算する関数の仮引数にconst使えない、ということになってしまいますから・・・
naohiro19 さん
typedefはこのように使うのが上手な使い方なのですね。
今までの自分の用法よりもすっきりしています。
面倒をかけて申し訳ありませんが、よろしくお願いします。