ポインタと配列について

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
m1631

ポインタと配列について

#1

投稿記事 by m1631 » 7年前

コード:

#include <stdio.h>
#include <stdlib.h>
int main() {
    int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
    int b[N];
    int *p, *q;
    int i;
    p= //何かを代入
    q= //何かを代入
       //配列aを出力する
       //while文を使って、逆順コピーのプログラムをかく。ただし、aとpとqを使用する。
  //配列bを出力する
    return 0;
}
//実行例
a [] : 1 2 3 4 5 6 7 8 9 10
b [] : 10 9 8 7 6 5 4 3 2 1
先生は、この方法で書いて来いといわれました。
僕は、pにはaのアドレスを、qにはbのアドレスを代入する?
配列aの出力はfor文で、というところまではなんとなくイメージできるのですが、そこから先が分かりません。

かずま

Re: ポインタと配列について

#2

投稿記事 by かずま » 7年前

この質問は問題の丸投げであり、フォーラムルールに反するので
回答は付きにくいと思います。
ポインタを使わず配列だけで逆順コピーするプログラムは書けますか?
それを見せてもらえると、ポインタを使うやり方のアドバイスを
差し上げましょう。

Math

Re: ポインタと配列について

#3

投稿記事 by Math » 7年前

これはC言語の正当な使用法を教えて下さっているのでしょう。今まで何度か書いたのですがいまだにまちがった説明が堂々となされているのでご注意ください。
配列の演算にポインター演算をつかうのははB言語からの影響です。

Embarcadero c (bcc5.5後継)C++11
bc.bat

コード:

bcc32c c1.c

c1.exe

pause
c1.c

コード:

#include <stdio.h>
#include <stdlib.h>
#define N 10
int main() {
    //const int N=10;
    int a[N] = { 1,2,3,4,5,6,7,8,9,10 };
    int b[N];
    int *p, *q;
    int i;
    p=a; //何かを代入
    q=b; //何かを代入
         //配列aを出力する
    for(i=0; i < N; ++i){ printf("%d", *(a + i) ); }
        //while文を使って、逆順コピーのプログラムをかく。ただし、aとpとqを使用する。
    i=0; printf("\n");
    while(i<N){ *(q + N-i-1) = *(p + i); ++i; } 
        //配列bを出力する
    for(i=0; i < N; ++i){ printf("%d", *(b + i) ); }
    return 0;
}
http://www2.koyoen.birdview.co.jp/~abcxyz/x0501.png

◆ a は *(a + i) の簡便記法であり 配列とは無関係であり a は i[a] と書いてもよい。
◆ 式の中で配列はポインターに読み替えられ a[] も a も同じ意味である

[]という添字演算子はシンタックスシュガーです。
https://ja.wikipedia.org/wiki/糖衣構文
C言語のところをさんしょうしてください。

Math

Re: ポインタと配列について

#4

投稿記事 by Math » 7年前

[訂正]
>◆ a は *(a + i) の簡便記法であり

◆ a は *(a + i) の簡便記法であり

Math

Re: ポインタと配列について

#5

投稿記事 by Math » 7年前

>配列とは無関係であり a は i[a] と書いてもよい。

配列とは無関係であり a[i]は i[a] と書いてもよい。

Math

Re: ポインタと配列について

#6

投稿記事 by Math » 7年前

>◆ a は *(a + i) の簡便記法であり

◆ a [i]は *(a + i) の簡便記法であり

(i が消える?)

かずま

Re: ポインタと配列について

#7

投稿記事 by かずま » 7年前

コード:

配列の要素を全部表示するプログラムは、
    for (int i = 0; i < N; i++) printf("%d\n", a[i]);

a の型は配列ですが、配列は、sizeof演算子と単項&演算子の
オペランドとなる場合を除いて、ポインタに変換されるので、
次のように書き換えることができます。
    for (int i = 0; i < N; i++) printf("%d\n", *(a + i));

ポインタ変数を使って書き直せと言われたら、
    int *p = a;   // すなわち int *p; p = a;
    for (int i = 0; i < N; i++) printf("%d\n", *(p + i));
と機械的に書き換えることができます。

しかし、これでは配列の添字に相当する i が残っているので
最初の a[i] と何ら変わるものではありません。

ポインタ変数を使って書き直せと言われたら、
    for (int *p = a; p < a + N; p++) printf("%d\n", *p);
と書くことが求められているのだと、私は思います。

配列 a の要素を逆順にしたものを配列 b にコピーしたかったら、
    int *p = a + N;
    int *q = b;
    while (p > a) *q++ = *--p;
と書くべきでしょう。

返信

“C言語何でも質問掲示板” へ戻る