
以下のソースをうごかすと「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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
define で 配列
-
ループカウンタを使用せず、配...
-
c言語プログラミング 等差数列...
-
C言語 ファイルの指定された行...
-
C言語を使って、ファイルの読み...
-
エラーが出てしまいます
-
C#で配列が空かを判定するには?
-
配列を使わずに、変数名を動的...
-
C# DataGridView のヘッダーセ...
-
Integer変数をカラにしたいので...
-
Excelですべての組合せ(重複組...
-
ExcelVBAでのkernel32(64bit)
-
isalpha()関数について
-
Run-Time Check Failure #3とい...
-
allocってなんですか?
-
CStringからchar*への型変換に...
-
C言語 配列の長さの上限
-
「#undef」と「#define」の使い...
-
VBAのプログラムで、DIAG = 1# ...
-
C言語の配列のサイズ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
配列の要素数に変数を入れたい...
-
C言語 ファイルの指定された行...
-
int i, int i[1];
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
C言語から質問です。
-
C#でのフィボナッチ数列
-
c言語 構造体
-
MFC - ダイアログボックスのPic...
-
構造体のextern方法
-
fclose()でセグメンテーション違反
-
C言語の課題が出たのですが自力...
-
2番目の最大値を求める
-
MFCのCArrayを使った二次元配列
-
const で宣言してるのに、値が...
-
配列の不正アクセスについて
おすすめ情報