ページ 1 / 1
ポインタと配列について
Posted: 2018年4月29日(日) 21:39
by m1631
コード:
#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: ポインタと配列について
Posted: 2018年4月30日(月) 10:57
by かずま
この質問は問題の丸投げであり、
フォーラムルールに反するので
回答は付きにくいと思います。
ポインタを使わず配列だけで逆順コピーするプログラムは書けますか?
それを見せてもらえると、ポインタを使うやり方のアドバイスを
差し上げましょう。
Re: ポインタと配列について
Posted: 2018年5月01日(火) 21:56
by Math
これは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言語のところをさんしょうしてください。
Re: ポインタと配列について
Posted: 2018年5月01日(火) 22:35
by Math
[訂正]
>◆ a は *(a + i) の簡便記法であり
◆ a は *(a + i) の簡便記法であり
Re: ポインタと配列について
Posted: 2018年5月01日(火) 22:48
by Math
>配列とは無関係であり a は i[a] と書いてもよい。
配列とは無関係であり a[i]は i[a] と書いてもよい。
Re: ポインタと配列について
Posted: 2018年5月01日(火) 22:55
by Math
>◆ a は *(a + i) の簡便記法であり
◆ a [i]は *(a + i) の簡便記法であり
(i が消える?)
Re: ポインタと配列について
Posted: 2018年5月02日(水) 08:18
by かずま
コード:
配列の要素を全部表示するプログラムは、
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;
と書くべきでしょう。