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

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

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

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

Q&A

解決済

2回答

12318閲覧

ポインタで間接参照のレベルが異なりますと表示されます。

mememe0331

総合スコア55

C

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

ポインタ

ポインタはアドレスを用いてメモリに格納された値を"参照する"変数です。

0グッド

1クリップ

投稿2020/06/09 07:44

編集2020/06/09 08:02

前提・実現したいこと

入力した値を変更して表示するプログラムを作っています。
具体手には、
x→z
y→x
z→y
に変更して表示します。

そのためにエラーを取り除きたいですが、できなくて困っています。
お力添えいただけると幸いです。

【追加】
すみません。説明不足でした。
rotateの内部で出力を行う必要があります。

発生している問題・エラーメッセージ

kadai5_2.c(29): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(29): warning C4024: 'swap': の型が 1 の仮引数および実引数と異なります。 kadai5_2.c(29): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(29): warning C4024: 'swap': の型が 2 の仮引数および実引数と異なります。 kadai5_2.c(30): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(30): warning C4024: 'swap': の型が 1 の仮引数および実引数と異なります。 kadai5_2.c(30): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(30): warning C4024: 'swap': の型が 2 の仮引数および実引数と異なります。 kadai5_2.c(31): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(31): warning C4024: 'swap': の型が 1 の仮引数および実引数と異なります。 kadai5_2.c(31): warning C4047: '関数': 間接参照のレベルが 'int *' と 'int' で異なっています。 kadai5_2.c(31): warning C4024: 'swap': の型が 2 の仮引数および実引数と異なります。

該当のソースコード

C言語

1#include <stdio.h> 2 3void swap(int *nx,int *ny); 4void rotate(int *x,int *y,int *z); 5 6int main(void) 7{ 8 int x,y,z; 9 10 printf("3つの整数を入力してください(1マスずつ開けて入力):"); 11 scanf("&d %d %d",&x, &y, &z); 12 13 rotate(&x,&y,&z); 14 15 return 0; 16} 17 18void swap(int *nx,int *ny) 19{ 20 int temp = *nx; 21 22 *nx = *ny; 23 *ny = temp; 24 25} 26 27void rotate(int *x,int *y,int *z) 28{ 29 swap(*x,*z); 30 swap(*y,*x); 31 swap(*z,*y); 32 33 printf("出力:%d %d %d",*x, *y, *z); 34 35 36}

試したこと

何をしたらいいのか分からなかったので、試してません。
すみません。

補足情報(FW/ツールのバージョンなど)

サクラエディタ、コマンドプロンプトfor VS 2019を使用しています。

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

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

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

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

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

dodox86

2020/06/09 07:53 編集

[不要なコメントとなったので削除しました]
guest

回答2

0

ベストアンサー

swap関数の引数はint型のポインタなのに、rotate関数から呼び出す際に実体(値)を渡しているため。

c

1 swap(*x,*z); 2 swap(*y,*x); 3 swap(*z,*y); 45 swap(x,z); 6 swap(y,x); 7 swap(z,y); 8

投稿2020/06/09 07:56

ttyp03

総合スコア17000

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

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

mememe0331

2020/06/09 08:17

ttyp03様、回答ありがとうございます。 出来ましたが、仕組みが分かりません…。 swapの仮引数がint型のポインタにだったから、*x*y*zを実引数にしました。 何故、*xだと実体を渡していて、xなら大丈夫なのですか? 申し訳ないのですが教えていただくことは可能でしょうか?
ttyp03

2020/06/09 08:26

rotate関数には各引数int*型で受け取っています。 つまりxという引数にはアドレス値が入っているわけです。 swap関数に*xとして渡してしまうと、xのアドレス値にある実体の値を渡すことになります。 main関数の変数名と引数名が同じだからわかりづらいですが、そういうことです。 余談ですが、実務ではそのような混乱をさけるためにポインタの場合、変数名の頭にpをつけたりします。 void rotate(int *px, int *py, int *pz) {  swap(px,pz);  swap(py,px);  swap(pz,py);
hidezzz

2020/06/09 08:46

関数の仮引数に付く「*」と、変数を使うときに付ける「*」は意味合いが違います。 仮引数に付いている「*」は変数の型の宣言です。 変数を使うときに「*」を付ける場合それはポインタ演算子です。 引数に「*」が付いてるからといって、変数を使うときにも単純に「*」を付けるというわけではありません。 > void rotate(int *x,int *y,int *z) 「x」という変数が、int型へのポインタ型の変数であることを宣言しています。 変数を使うとき、 「x」はint型のポインタ型で、int*型、 「*x」はポインタ「x」に書かれているint型の数値でint型、 「&x」は[ポインタ「x」のアドレスでint*型のポインタでint**型(今回は出てきません)、 となります。 呼び出そうとしているswap()関数の宣言は「void swap(int* nx, int* ny)」となっているので、 int*の変数を渡す必要があります。 int*型なのは「x」です。
mememe0331

2020/06/09 09:09

お二方ともご回答いただきありがとうございます! お陰様で理解できました。とても助かりました!!!
guest

0

C

1#include <stdio.h> 2 3void swap(int* nx, int* ny); 4void rotate(int* x, int* y, int* z); 5 6int main(void) { 7 int x, y, z; 8 9 printf("3つの整数を入力してください(1マスずつ開けて入力):"); 10 scanf("%d %d %d", &x, &y, &z); 11 rotate(&x, &y, &z); 12 printf("出力:%d %d %d", x, y, z); /* ここでプリント */ 13 14 return 0; 15} 16 17void swap(int* nx, int* ny) { 18 int temp = *nx; 19 *nx = *ny; 20 *ny = temp; 21} 22 23void rotate(int* x, int* y, int* z) { 24 swap(x, z); 25 swap(y, x); 26// swap(z, y); /* イラネ */ 27}

投稿2020/06/09 07:53

episteme

総合スコア16612

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.37%

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

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

質問する

関連した質問