C言語関係掲示板

過去ログ

No678 constについて

[戻る] [ホームページ]
No.7718

constについて
投稿者---huji(2003/06/24 11:36:58)


c言語勉強中で初心者です。勉強中に引っかかったことがるので書き込みしました。

constについて勉強をしていて、
「constを付けると関数内での値をいじれない」というニュアンスで
捕らえているのですがそういう理解でいいのですか?

あと、ある問題で配列の入れ替えの問題があり以下のソースで上手くいきました。

#include <stdio.h>
void cp(int a[], const int b[]);
void main()
{
	int x[5];
	int y[]={1,2,3,4,5};
	int i;
	cp(x,y);
	for(i=0;i<5;i++)
	{
		printf("x[i]=%d,y[i]=%d\n",x[i],y[i]);
	}
}

void cp(int a[],const int b[])//なぜb[]をconstに?
{
	int i=0;
	while(i<5)
	{
		a[i]=b[i];
		i++;
	}
}


しかししっくり来ていない部分があって
void cp(int a[],const int b[])
なぜbはconstをつけないといけないのですか?
bをaに代入するだけなら値が変わることも無いと思うのですが。

いまいち分かっていないので、基本的な部分での理解が乏しい為に
こんな疑問をもってしまうのか分かりませんが、constとは何ぞやという部分において詳しい説明とか頂けたらうれしいです。

よろしくお願いします。


No.7719

Re:constについて
投稿者---nop(2003/06/24 11:47:21)


>void cp(int a[],const int b[])
>なぜbはconstをつけないといけないのですか?
>bをaに代入するだけなら値が変わることも無いと思うのですが。

この場合、ポインタ変数 b のポインタ値を介して、
ポインタ変数 b が差すオブジェクトを変更出来ない、
と言う事をコンパイラに伝え、
もし、ポインタ変数 b のポインタ値を介して、
ポインタ変数 b が差すオブジェクトを変更しても、
コンパイルエラーと出来るようにするためです。

また、関数の呼び元にポインタ変数 b のポインタ値を介して、
ポインタ変数 b が差すオブジェクトは変更されない、
と言うことを保証する意味持ちます。

No.7721

Re:constについて
投稿者---huji(2003/06/24 12:06:53)


お返事有難うございます。
何となくは分かっているのですがまだしっくりこないです。

>ポインタ変数 b が差すオブジェクトは変更されない、と言うことを保証する意味持ちます。

そこで

void cp(int a[],const int b[])

のconstを外しても特に差し支えは無いと思うのですが、exeエラーが出ます。これは何故ですか?

つまりconstを付ければオブジェクトは変更されない事を保証する訳ですが、付いていないならいないで別に通りそうに思うんですが。
理解不足で申し訳ないですがよろしくお願いします。

No.7722

Re:constについて
投稿者---nop(2003/06/24 12:12:06)


>void cp(int a[],const int b[])
>
>のconstを外しても特に差し支えは無いと思うのですが、exeエラーが出ます。これは何故ですか?

プロトタイプ宣言

>void cp(int a[], const int b[]);

の const は外しましたか?


No.7720

Re:constについて
投稿者---たいちう(2003/06/24 12:02:08)


> しかししっくり来ていない部分があって
> void cp(int a[],const int b[])
> なぜbはconstをつけないといけないのですか?
> bをaに代入するだけなら値が変わることも無いと思うのですが。

関数を作る人と使う人が別の人だと思ってください。
関数の中身を確認することなく安心して使えるようになります。
一人で開発する場合でもケアレスミスに気付くチャンスが増えます。

No.7723

Re:constについて
投稿者---huji(2003/06/24 13:10:04)


たいちろうさん、nopさん、お返事有難うございます。

>関数を作る人と使う人が別の人だと思ってください。
>関数の中身を確認することなく安心して使えるようになります。
>一人で開発する場合でもケアレスミスに気付くチャンスが増えます。

ニュアンスがつかめてきました。値が変わる心配をなくせるということですよね。後は使い慣れていきたいと思います。

>void cp(int a[], const int b[]);の const は外しましたか?

すいません忘れてました。const無しでも通りました。

これで次のステップにいけます。お二方説明有難うございました。