🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C

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

ポインタ

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

Q&A

2回答

852閲覧

アドレスの一般的な使い方とは

peace_1

総合スコア14

C

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

ポインタ

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

0グッド

0クリップ

投稿2021/01/23 09:57

C言語で値を降順に並べ替えるプログラムを作成しました。
処理自体は間違っていないのですが、
ポインタのアドレスをずらすように使って下さいという指摘がありました。
修正するべき箇所が分からないのですが、一般的なアドレスの使い方って他にありますでしょうか?

C言語

1typedef struct{ 2 short no; 3 short jp; 4 short math; 5 short science; 6 short social; 7 short sum; 8}DATAstudent; 9 10/*合計値を降順に並べ替え*/ 11void SortDesc(DATAstudent *gradesList, int cnt){ 12 int loop1 = 0; 13 int loop2 = 0; 14 DATAstudent bfData = {0,0,0,0,0,0}; 15 16 for (loop1 = 0; loop1 < cnt; loop1++) { 17 for (loop2 = loop1 + 1; loop2 < cnt; loop2++) { 18 if((gradesList + loop1)->sum < (gradesList + loop2)->sum) { 19 bfData = *(gradesList + loop1); 20 *(gradesList + loop1) = *(gradesList + loop2); 21 *(gradesList + loop2) = bfData; 22 } 23 } 24 } 25}

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

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

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

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

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

dodox86

2021/01/23 10:24 編集

*(gradesList + 2); は、 gradeList += 2; *gradeList; で、同じ位置を指します。ズラすとは、++gradeList; のようにポインタ自体を増減させることを言っていると思いますが、それで分かりますか?
guest

回答2

0

int 変数を使わないということではないのでしょうか?

C

1void SortDesc(DATAstudent *gradesList, int cnt) 2{ 3 DATAstudent tmp, *p, *q, *end = gradesList + cnt; 4 for (p = gradesList; p < end; p++) { 5 for (q = p + 1; q < end; q++) { 6 if (p->sum < q->sum) { 7 tmp = *p; *p = *q; *q = tmp; 8 } 9 } 10 } 11}

投稿2021/01/23 12:19

kazuma-s

総合スコア8224

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

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

0

多分、こういう事?

C

1 for (loop1 = 0; loop1 < cnt; loop1++) { 2 for (loop2 = loop1 + 1; loop2 < cnt; loop2++) { 3 // .... 4 } 5 }

のところを、

C

1 for (loop1 = 0; loop1 < cnt; loop1++) { 2 // *(gradesList + loop1) の代わりに 3 // *gradesList とする。 4 DATAstudent *gradesList2 = gradesList + 1; 5 for (loop2 = loop1 + 1; loop2 < cnt; loop2++) { 6 // *(gradesList + loop2) の代わりに 7 // *gradesList2 を使う。 8 gradesList2++; // インクリメント 9 } 10 gradesList++; // ポインタのインクリメント 11 } 12

でしょうか?

投稿2021/01/23 10:34

pepperleaf

総合スコア6385

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問