こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

C言語の文字列を含んだ構造体

下記のサイトに構造体のことが書かれています。
http://www.isl.ne.jp/pcsp/beginC/C_Language_14.html
その中の (3)構造体の初期化 の記述で
 //構造体の型宣言
 struct student{
  int no;// 学籍番号
  char name[256]; // 氏名
  int year; // 学年
  char student_class[256];// クラス
 };
と書かれています。

次の(4)構造体のデータ参照では、
 //構造体の型宣言
 struct OLD{
  int no; //番号
  char *name; //名前
  int s_year; //年
  char s_class; //クラス
 };
と書かれています。

ここで質問です。
前者の名前は char name[256] ですが、
後者の名前は char *name になっています。
name[256] と *name では何が違うのでしょうか?
どういうときに使い分けるのでしょうか?

投稿日時 - 2018-05-07 22:01:53

QNo.9496189

困ってます

質問者が選んだベストアンサー

これはサイトの記述が悪いです。
構造体の説明をやってる中でいきなり何の前触れもなく配列型とポインタ型が出てきたら質問者さんのように混乱するのもムリはないです。(4)のサンプルプログラムでもポインタ型を使う必要がないし、むしろ配列型の記述のほうがよいように思います。

ポイント型と配列型の違いは他の回答者さんの説明にあるとおり。
付け加えるならば、値をコピーせずに元の名前情報を格納している位置情報を管理するか、値がコピーされて別情報として管理されるかの違い。
(4)のように構造体のメンバとしてchar *name; // 氏名 と定義した状態でoldの初期化を行った場合、構造体の内部のnameには4byte(じゃないときもありますが)のメモリ領域が確保された上で、別のメモリ領域にある上杉謙信などの名前のデータが管理されているメモリ位置情報(アドレス情報)が格納されます。
一方で構造体のメンバとしてchar name[256]; // 氏名 と定義した状態で(4)のoldの初期化を行った場合、構造体の内部に265byteのメモリ領域が確保され、そこに上杉謙信などのの名前のデータがコピーされて格納されます。
(4)のサンプルプログラムに追加で
printf("size-OLD=%d",sizeof(OLD));
・・・などを書いてみれば理解の助けになるでしょうか?

投稿日時 - 2018-05-08 21:01:48

お礼

ありがとうございます。

投稿日時 - 2018-05-10 22:33:06

ANo.4

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

配列とポインターの扱いは自力で乗り越えてください
文字列もポインターです。基本なのに結構スルーされてる
printfとscanfの%sで扱い変わるように見えるからややこしい

#include <stdio.h>

int main(void){
char name_1[25] = "Hello World";
char *name_2 = "Hello World";

//name_1 = "Hey Mickey";//エラーになる
name_2 = "Hey Mickey";

printf("%s : %s\nType to : ",name_1,name_2);

scanf("%s",name_1);//文字列を配列ポインターに代入

printf("%s : %s\n",name_1,name_2);
return 0;
}

投稿日時 - 2018-05-09 23:27:22

お礼

ありがとうごじます。

投稿日時 - 2018-05-10 22:33:28

ANo.3

char name[256] char型のデータを256個格納できる。
char *name   char型のデータがある位置(ポインター)を格納する。
        データの格納には別のエリアが必要になります。

投稿日時 - 2018-05-08 03:00:37

お礼

ありがとうございます。

投稿日時 - 2018-05-10 22:32:54

ANo.2

構造体は関係ないです。
配列とポインタの違いです。
配列とポインタがどう違うかは検索してみれば色々見付かると思います。
一応、一例 http://www9.plala.or.jp/sgwr-t/c/sec10-2.html

投稿日時 - 2018-05-07 22:56:26

お礼

ありがとうございます。

投稿日時 - 2018-05-10 22:33:00

ANo.1

char name[256]はchar型のデータを格納する連続した領域を256個確保して,その先頭の領域にnameという名前を付けた。だからその先頭の領域はname[0]でアクセスできる。またここは*nameでもアクセスできる。その次の領域はname[1]でアクセスできるし,*(name+1)でもアクセスできる。
char *nameはchar*型のデータを格納する領域を1個確保して,そこにnameという名前を付けた。*nameでそこにアクセスできる。*(name+1)はその次の領域だが,どんな使われ方をしているかは保証されない。

投稿日時 - 2018-05-07 22:52:09

お礼

ありがとうございます。

投稿日時 - 2018-05-10 22:33:46

あなたにオススメの質問