質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

1回答

1097閲覧

C言語 ポインタ変数に関して

infra____

総合スコア90

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/08/10 01:44

編集2020/08/10 01:51

以下のソースコードは、http://c-lang.sevendays-study.com/ex-day5.htmlのサンプルコードです。
// 構造体のデータを表示する関数の下の行に記載されている
void setData(student_data*,int,char*,int);に関して、なぜstudent_dataとcharはポインタ変数が定義されていて、それ以外はされていないのでしょうか。この差ってなんですか?

また、//データのセットの3行下に以下が記述されていますが、 data->name = name; にしない理由はなぜですか。
strcpy(data->name,name); // 名前のコピー

以上、ご教示のほど、よろしくお願い致します。

include <stdio.h> include <string.h> // 学生のデータを入れる構造体 typedef struct{ int id; // 学生番号 char name[256]; // 名前 int age; // 年齢 }student_data; // 構造体のデータを表示する関数 void setData(student_data*,int,char*,int); void showData(student_data*); void main(){ student_data data[4]; int i; int id[] = { 1,2,3,4 }; char name[][256] = { "山田太郎","佐藤良子","太田隆","中田優子" }; int age[] = { 18,19,18,18 }; // データの設定 for(i = 0; i < 4; i++){ setData(&data[i],id[i],name[i],age[i]); } // データの内訳を表示 for(i = 0; i < 4; i++){ showData(&data[i]); } return; } // データのセット void setData(student_data* data,int id,char* name,int age){ data->id = id; // idのコピー strcpy(data->name,name); // 名前のコピー data->age = age; // 年齢のコピー } // データの表示 void showData(student_data* data){ printf("学生番号:%d 名前:%s 年齢:%d¥n",data->id,data->name,data->age); } コード ```

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

raccy

2020/08/10 01:52 編集

http://c-lang.sevendays-study.com/ex-day5.html のサイトのコードと思われますが、「あるサイト」と引用元を曖昧にせずに質問文に明記してください。引用元を明記しないと引用の要件を満たさず、著作権違反に問われる場合があります。
ironya

2020/08/10 01:48

ソースコード部分は ``` をソースコード全体の前後の行に入れてください。 読みにくいです。
infra____

2020/08/10 01:51

修正しました。ご指摘ありがとうございます。
guest

回答1

0

ベストアンサー

なぜstudent_dataとcharはポインタ変数が定義されていて、それ以外はされていないのでしょうか。

どちらも変数は定義されていませんstudent_data*intも、引数の型を表すものです。

data->name = name; にしない理由はなぜですか。

C言語では、配列同士の代入はできません。

投稿2020/08/10 01:50

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

infra____

2020/08/10 01:56

コメントありがとうございます。 intをint*にしない理由はなぜですか? >>C言語では、配列同士の代入はできません。 →だとすると、 data->id = id; にも同じことが言えませんか?
maisumakun

2020/08/10 02:00

> intをint*にしない理由はなぜですか? 引数の型は、関数を作るときに自由に選べます。わざわざポインタを介する必要がなければintでも大丈夫です。 > data->id = id; にも同じことが言えませんか? data->id は配列ではないです。
ironya

2020/08/10 02:02

>intをint*にしない理由はなぜですか? 値を受け取れば十分だからですね。ポインタを受け取る時は、呼び出し側で指定した変数の内容そのものを書き換えたい時です。 >data->id = id; にも同じことが言えませんか? 言えません。 id は int型なので配列ではありません。 C言語の解説本などで、変数の型と宣言、関数への値渡しと参照渡しあたりを熟読されることをお薦めします。
infra____

2020/08/10 02:05

お二方ともご返信ありがとうございます。どうやら、基本の理解がおろそかなようですね。出直してきます。
ironya

2020/08/13 12:45

ドンマイ、がんばれー
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問