以下のソースをうごかすと「21行目」の「print_dt(&stu);」でエラーが出てしまいます。
エラーコード
Warning: illegal pointer combination (param)
#include <stdio.h>
#define N 20
typedef struct{
int bangou;/*学生番号*/
int sintyou;/*身長*/
}Student;
void print_dt(Student *p);
int main( ){
Student stu[N+1];
int i = 0;
printf("学生番号、身長を入力(終了条件:Ctrl+Z)\n");
while( (scanf("%d %d",stu[i].bangou,stu[i].sintyou)!=EOF)&&i<N){
i++;
}
stu[i].bangou = 0;/*ストッパー*/
stu[i].sintyou = 0;/*ストッパー*/
print_dt(&stu);
return 0;
}
/*** データ表示処理 ***/
void print_dt(Student *p){
printf("学生番号 身長\n");
while( p->bangou != 0 && p->sintyou != 0 ){/*ストッパーまでループ*/
printf("%-10d %5d\n",p->bangou, p->sintyou);
p++;
}
}
どこを直せばうごきますか?教えてください。。
A 回答 (7件)
- 最新から表示
- 回答順に表示
No.7
- 回答日時:
つまり、同じ *pA という表記でも、
どういう局面で書くかによって
・pA という、何か別の変数のアドレスを格納するための箱の定義
・pA に入っている、何か別の変数(例えば n)のアドレスを介して、当該変数(例えば n)の値を取得する、という行為
という違いがあります。
void print_dt(Student *p);
ここでの「*p」は構造体配列「stu」のアドレスをうけとる
while( (scanf("%d %d",&stu[i].bangou,&stu[i].sintyou)!=EOF)&&i<N){
ここでの「&stu[i].bangou」はアドレスに値を格納する
print_dt(stu);
ここでの「stu」はアドレスを渡している
「&」と「*」の使いかたが理解不足でした
ありがとうございました!
No.6
- 回答日時:
> *pAっていうのはポインタのポインタ??
いいえ、そうではありません。
変数の定義時に
int *pA;
と書けば、「pAは、int型のアドレスを格納する箱」という意味です。
一方、
int *pA;
int n = 123;
pA = &n; // pAは、nのアドレス
と書けば、*pAは、nのアドレスが指している場所の値(つまり、123)です。
この回答への補足
int *pA = pAはint型のアドレスを格納する箱
int *pA; /*int型のアドレスを格納する箱を用意*/
int n = 123; /*int型を格納する箱を用意*/
pA = &n; /*pAにはnのアドレスが格納される*/
結果…
pAにはnのアドレス値が格納されていて*pAはnのアドレスが咲いている場所の値を指す
ソースを書いてみます。。
【確認ソース】
#include <stdio.h>
main( ){
int *pA;
int n = 123;
pA = &n;
printf("%d \n", pA);
printf("%d \n", *pA);
return 0;
}
以上の結果は
pA = 3912 /*nのアドレス値*/
*pA = 123 /*nの値*/
でした!!!
No.5
- 回答日時:
> 配列に&をつけることで正常に始動しました
&を付けることは正しいですが、「配列に」付けたわけではありません。
scanf()を使って、stu[i].bangou という変数に格納するから、
stu[i].bangou のアドレスを指定しているのです。
仮に、
int n;
という変数定義があるとして、
scanf()を使って n に値を格納するとき、
scanf("%d", &n);
と書くのと同じことです。
この回答への補足
変数に格納するときにはアドレスを指定する。。。
変数を「箱」とみなして、箱の場所をはっきりさせないといけないんですよね。基本がうやむやでしたっ。
最初のポインタに戻りますが
「ポインタはアドレスを格納する変数」
int a;
int *pA;
a=5;
pA=&a;
*pA と a はイコールで結ばれる
*pAっていうのはポインタのポインタ??
「ポインタに対して*演算子(間接参照演算子)をつけるとそのポインタから逆にたどってもとの変数の値を知ることができる」
少し頭がこんがらがっていますっ。ですがなんとなく変数とアドレス、ポインタが見えてきたような気がします。
ありがとうございました!
No.4
- 回答日時:
> while( (scanf("%d %d",stu[i].bangou,stu[i].sintyou)!=EOF)&&i<N){
ここに大きな問題があります。
コンパイルエラーにはなりませんが、正しく実行できません。
scanf関数の第2引数以降はポインタであることを再確認してください。
この回答への補足
何度もありがとうございます(泣)
while( (scanf("%d %d",&stu[i].bangou,&stu[i].sintyou)!=EOF)&&i<N){
配列に&をつけることで正常に始動しました
自分なりの理解がまだできていません。。。言葉で説明できるまでもう少し待ってください。。。
一つだけわかったことがあります
#include <stdio.h>
int main(void){
int test[5]
int i, j;
printf("5人の点数を入力してください\n");
for(i=0; i<5 ; i++){
scanf("%d", &test[i]);
}
for(j=0; j>5; j++)[
pirntf("%d番目の人の点数は%dです\n", j+1, test[j]);
No.3
- 回答日時:
配列名は、当該配列の先頭要素へのポインタである、
という大原則があります。
で、&stu が Student ** 型であれば、何が Student * 型であるのかは
少し考えればわかるはずです。
ここで答えを書くのは簡単ですが、一度ご自分で
ウンウンうなりながら考えてみてください。
参考書に「プログラムの中で[ ]がなく単独で現れた配列名はその配列の一番初めの要素アドレスとなります」とあります
ですので「 &stu 」を渡すのではなく「 stu 」のみを渡す、つまり単独で現れた「 stu 」自体がすでにアドレスをあらわしているという理解でいいのでしょうか?
プログラムを指導してみたところ正常に動きました。が・・・。
プリントができませんでした。今度は「 print_dt( ) 」関数の方でミスがあるみたいです。。。
ボロボロでスイマセン。。。
No.2
- 回答日時:
> print_dt(&stu);
渡している引数の型が合っていません。
print_dt関数はStudent * 型の引数を期待していますが、
実際に渡しているのはStudent ** 型です。
ご指摘ありがとうございます
ダブルポインタを渡してしまっているとの事。。。
自分のコードでは「アドレス値を渡さないといけないところを中身の数値を渡してしまっている」ということでしょうか?
渡すものを考えて 「 print_dt(&stu[N+1]) 」にしてみたら動いたのですが正常な数値は得られませんでしたっ
ポインタのところがぜんぜん理解できていないのだと思います。
もう一度 「 print_dt( ) 」に何を渡せばいいのか教えてくださいませんか?
お願いします。。。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C言語 プログラミング 4 2022/05/22 11:53
- C言語・C++・C# c言語の問題です 3 2023/01/10 16:15
- C言語・C++・C# c言語でユーザ関数を利用して入力された文字列を反転させるプログラムを作りたいです。 3 2023/01/29 19:47
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- その他(プログラミング・Web制作) 十進BASICでの再帰についての質問です。 2 2022/11/18 09:17
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- C言語・C++・C# C言語の課題が出たのですが自力でやっても分かりませんでした。 要素数がnであるint型の配列v2の並 3 2022/11/19 17:41
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
define で 配列
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
c言語 構造体
-
char型配列をint型に代入するには
-
C言語で重複組合せを全列挙
-
C言語 ファイルの指定された行...
-
関数への構造体の配列の渡し方<...
-
エラーが出てしまいます
-
配列における数値の比較について
-
ポインタを使って構造体の配列...
-
C言語 ビットフィールドについて
-
c言語
-
char gyou[1024];でcharの表現...
-
callocで二次元配列を作成する...
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
C#でプログラミングしてるので...
-
MFC - ダイアログボックスのPic...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
C言語において、 配列要素をひ...
-
配列の要素数に変数を入れたい...
-
構造体のextern方法
-
define で 配列
-
c言語
-
C#で構造体の配列を持った構造...
-
C言語の2次元配列 容量が大き...
-
c言語 構造体
-
C言語 ファイルの指定された行...
-
C言語についてです 5人のテスト...
-
int i, int i[1];
-
fclose()でセグメンテーション違反
-
char型配列をint型に代入するには
-
C言語から質問です。
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
[C++]const int と配列
おすすめ情報