Visual Studioでは1度変数宣言、配列宣言をおこなったならそのときと同じ変数名、配列名をつかって再度変数宣言、配列宣言を行うことはできません。🍓

Visual Studioでは1度変数宣言、配列宣言をおこなったならそのときと同じ変数名、配列名をつかって変数宣言、配列宣言を行うことはできません。🍓

ソーラー「

char hairetu[]="nekoneko";


のように


配列をつかって文字列データ"nekoneko"をメモリに格納する場合と


char *hairetu="nekoneko";


のように


ポインタ変数をつかって文字列データ"nekoneko"をメモリに格納する場合の


違いを述べる前に


まず基本的な事柄の確認をしてみようよ。


アレサ」


アレサ「そうですね。


その基本的な事柄とは


Visual Studioでは1度変数宣言、配列宣言をおこなったならそのときと同じ変数名、配列名をつかって変数宣言、配列宣言を行うことはできません。


というものなんですの」


#include <stdio.h>


int main(void){


int a=5;

int a=6;


printf("%d\n",a);


return 0;

}


コンパイル結果


EAZY IDECの場合

6


Visual Studioの場合


エラー C2374 'a': 再定義されています。2 回以上初期化されています。



アレサ「このように

統合開発環境EAZY IDECでは


同じ変数名の変数宣言

int a;

2回行うことができるのですが


Visual Studioでは

変数宣言

int a;

2回実行することはできません。


さらに次のプログラムをご覧ください。


#include <stdio.h>


int main(void) {


char hairetu[] = "neko";

char hairetu[] = "nyan";

printf("%s\n", hairetu);


return 0;


}


EAZY IDECの場合

nyan


Visual Studioの場合


エラー C2374 'hairetu': 再定義されています。2 回以上初期化されています。




アレサ「このように

統合開発環境EAZY IDECでは


同じ配列名の配列宣言


char hairetu[] = "neko";

char hairetu[] = "nyan";

2回行うことができます。


そして


配列に格納される文字列データが


"neko"から

"nyan"


変更できているのが


コンパイル結果

nyan

ご覧になられてもわかりますの。


それに対し


Visual Studioでは


同じ配列名の配列宣言、初期化


char hairetu[] = "neko";

char hairetu[] = "nyan";


2回実行することはできません。


では😊


さらに次のプログラムをご覧ください。


#include <stdio.h>


int main(void) {


int hairetu = 6;


char hairetu[] = "neko";


printf("%d\n", hairetu);

printf("%s\n", hairetu);


return 0;


}



EAZY IDECの場合

1703754

neko


Visual Studioの場合


エラー C2040 'hairetu': 'char []' は 'int' と間接操作のレベルが異なります。


アレサ「このプログラムでは


同じ名前hairetuをつかって


変数宣言、初期化である


int hairetu = 6;



配列宣言、初期化である


char hairetu[] = "neko";


がおこなわれています。


このように

変数名と

配列名を同じhairetuにしてしまうと


EAZY IDECの場合

コンパイルすることはできますが


printf("%d\n", hairetu);

により

コンパイル結果に表示されるはずの

6

が正しく表示されません


Visual Studioでは


このような事態を避けるために


配列名と変数名が同じhairetuとなっている場合は


ビルドエラーが表示されるように設定されています。」


ソーラー「ですので以下のプログラムは


統合開発環境EAZY IDECでしか実行することができません。



#include <stdio.h>


int main(void) {


char hairetu[] = "neko";

char hairetu[] = "nyan";

printf("%s\n", hairetu);


return 0;


}


EAZY IDECの場合

nyan


ソーラー「ちゃんと コンパイル結果


nyanが表示されているね。


このとき


どのようなことが起こっているのかな?


アレサ「はいっ


まず


char hairetu[] = "neko";


が実行されると


char型の配列変数


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


が生成され

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='\0';


文字データ"neko"が格納されます。


次に


char hairetu[] = "nyan";


が実行されると


char hairetu[] = "neko";

の時と同じく


hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]


が生成され

配列変数

hairetu[0]

hairetu[1]

hairetu[2]

hairetu[3]

hairetu[4]

には

hairetu[0]='n';

hairetu[1]='y';

hairetu[2]='a';

hairetu[3]='n';

hairetu[4]='\0';


文字データ"nyan"が格納されます


このとき


hairetu[0]='n';

hairetu[1]='e';

hairetu[2]='k';

hairetu[3]='o';

hairetu[4]='\0';


格納されていた文字データは


hairetu[5]='n';

hairetu[6]='e';

hairetu[7]='k';

hairetu[8]='o';

hairetu[9]='\0';


とずれる形で


配列変数に格納されることになります。


そのプログラムを実行して確認してみましょう。


#include <stdio.h>


int main(void) {


char hairetu[] = "neko";

char hairetu[] = "nyan";

printf("%c\n", hairetu[0]);

printf("%c\n", hairetu[1]);

printf("%c\n", hairetu[2]);

printf("%c\n", hairetu[3]);

printf("%c\n", hairetu[4]);

printf("%c\n", hairetu[5]);

printf("%c\n", hairetu[6]);

printf("%c\n", hairetu[7]);

printf("%c\n", hairetu[8]);

printf("%c\n", hairetu[9]);

printf("%s\n", hairetu);


return 0;

}


コンパイル結果

n

y

a

n


n

e

k

o


nyan

続行するには何かキーを押して下さい . . ._


■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□


ソーラー「わあ 綺麗だね。楽しいね。アレサ


まるで


コンピュータの世界にはいりこんだみたいだ・・・」


□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

アレサ「はい ソーラーさん。」

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□


ソーラー「

hairetu[0]='n';

hairetu[1]='y';

hairetu[2]='a';

hairetu[3]='n';

hairetu[4]='\0';

hairetu[5]='n';

hairetu[6]='e';

hairetu[7]='k';

hairetu[8]='o';

hairetu[9]='\0';


と文字データが格納されているわけだね


hairetu[4]='\0';

hairetu[9]='\0';

と格納されている

文字データ'\0'

printf("%c\n", hairetu[4]);

printf("%c\n", hairetu[9]);


によりprintf出力表示されると

空白が表示されているね。


そして

printf("%s\n", hairetu);


のコンパイル結果が


nyan


となっていることからも


最後に

char hairetu[] = "nyan";


によりメモリに格納された文字列データ"nyan"を


格納しているメモリの先頭のアドレスが


ポインタ変数hairetuに格納されていることがわかるね。


printf("%s\n", hairetu);


はポインタ変数hairetuに格納されているアドレスのメモリに


格納されている文字列データを


コマンドプロンプト画面に表示するんだったものね。」




■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

■□□□■□□□■□□□■□□□■□□□■□□□

□■□■□■□■□■□■□■□■□■□■□■□□

□□■□□□■□□□■□□□■□□□■□□□■□

□□■□□□■□□□■□□□■□□□■□□□■□

□■□■□■□■□■□■□■□■□■□■□■□□

■□□□■□□□■□□□■□□□■□□□■□□□

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

作者を応援しよう!

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

応援したユーザー

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