下記のプログラムのどこがどうダメなのか教えてください。
1.関数の引数に通常の変数を渡すと値渡しとなり、
呼び出し元の変数に変更を加えることができませんが、
関数の引数に配列を渡すと参照渡しとなり、
呼び出し元の関数でも変更を加えることができると認識しています。
2.&data[0]やdataは配列の先頭のアドレスを指しており、
呼び出し先の関数でdata[i]->nameとすれば、
student型data変数の先頭のアドレスから
i個離れたアドレスのname要素にアクセスすると認識しています。
また、*(構造体ポインタ変数名).要素名 と
構造体ポインタ変数名->要素名 の 使い分けもいまいち理解できていません。
(scanf("%s", *(data[i]).name); としてもエラーが出ました)
C言語
1#include <stdio.h> 2#include <string.h> 3 4typedef struct student_tag { 5 char name[64]; 6 int year; 7 char sex; 8} student; 9 10void student_input(student *data/* あるいは data[] ? */, int count); 11void student_print(student *data/* あるいは data[] ? */, int count); 12 13int main(void) { 14 student data[3]; 15 16 student_input(&data[0]/* あるいは data ? */, 3); 17 student_print(&data[0]/* あるいは data ? */, 3); 18 19 return 0; 20} 21 22void student_input(student *data, int count) { 23 int i; 24 char txt; 25 for (i=0; i<count; i++){ 26 scanf("%s", data[i]->name); 27 scanf("%d", data[i]->year); 28 scanf("%s", data[i]->sex); 29 } 30 31 return; 32} 33 34void student_output(student data[], int count) { 35 int i; 36 for (i=0; i<count; i++){ 37 printf("[名前]\t%s\n", data[i]->name); 38 printf("[年齢]\t%d\n", data[i]->year); 39 printf("[性別]\t%s\n", data[i]->sex); 40 } 41 42 return; 43}
下記追記(2018_0316_1907)
>ドット演算子を使うべき場面で、アロー演算子を使っていること。
ドット演算子を使うべき場面が分からなくなってきました...
頭の整理のために下記のようなものを書いてみましたが、コメントの通り混乱しております。Wandbox
1.warning: format '%p' expects argument が出ているのは
pdata[0],pdata[1],pdata[2]にアドレスが入ってないからでしょうか。
2.*pdataというポインタ変数を宣言していますが、配列ではなく
pdataという配列を宣言していないのに、pdata[1]など、要素にアクセスしようとするとエラーになるのでしょうか。
pdata[1]はpdataに格納されたアドレスから1個分離れたアドレスではないのでしょうか。
pdata[0]がpdataに格納されたと同じにならないのはなぜでしょうか。
このあたりの解釈について、上手くまとまっているサイトなどはないでしょうか。
C言語
1#include <stdio.h> 2#include <string.h> 3 4typedef struct student_tag { 5 char name[64]; 6 int year; 7 char sex[64]; 8} student; 9 10int main(void) { 11 student data[3]; 12 student *pdata; 13 pdata = data; 14 printf("_data___ = %p\n", data); //先頭のアドレス 15 printf("pdata___ = %p\n", pdata); //先頭のアドレス 16 printf("&data[0] = %p\n", &data[0]); //先頭のアドレス 17 printf("pdata[0] = %p\n", pdata[0]); //先頭のアドレス+0個離れてるアドレスのはずなのに先頭のアドレス+0と違う? 18 printf("_data[0] = %p\n\n", data[0]); //pdata[0]と同じアドレス? そもそも何者? 19 20 printf("&data[1] = %p\n", &data[1]); //先頭のアドレス+1個離れたアドレス 21 printf("pdata[1] = %p\n", pdata[1]); //先頭のアドレス+1個離れてるアドレスのはずなのに先頭のアドレス+1と違う? 22 printf("_data[1] = %p\n\n", data[1]); //謎 23 24 printf("&data[2] = %p\n", &data[2]); //先頭のアドレスから2個離れたアドレス 25 printf("pdata[2] = %p\n", pdata[2]); //先頭のアドレス+2個離れてるアドレスのはずなのに先頭のアドレス+2と違う? 26 printf("_data[2] = %p\n\n", data[2]); //謎 27 28 //strcpy(data->name, "Mario"); //いける 29 //strcpy(data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない 30 //strcpy(&data[0]->name, "MARIO"); //構造体ポインタ変数名じゃないからいけない 31 //strcpy(pdata[0]->name, "MARIO"); //構造体ポインタ変数名だけど、要素がついたらいけない? そういう決まり? 32 strcpy(pdata->name, "MARIO"); //いける 33 //printf("data[0]->name = %s\n",data[0]->name); //構造体ポインタ変数名じゃないからいけない 34 //printf("pdata[0]->name = %s\n",pdata[0]->name); //構造体ポインタ変数名なのになぜかいけない? 35 printf("data[0].name = %s\n",data[0].name); //いける 36 printf("pdata[0].name = %s\n",pdata[0].name); //いける 37 38 return 0; 39}
回答4件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/03/18 16:02