short 変数 Sへのポインター は
のように定義されると思いますが、
では、
shortメンバーの数が1000くらいあるshort配列へのポインターを
どう定義すれば良いのでしょうか。
配列へのポインターとシングル変数へのポインターの区別
Re: 配列へのポインターとシングル変数へのポインターの区別
関数ポインターは
同様に、配列へのポインターは
ただし、これはメンバーの数が「1000くらい」ではなく「1000」の配列へのポインターです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列へのポインターとシングル変数へのポインターの区別
sizeof(*sap)を取ると、配列なので、前者ではshort1000個分のサイズ、後者ではshort10個分のサイズになるはずです。drone さんが書きました:コンピューターは本当に
「short (*sap)[1000] 」と 「 short (*sap)[10] 」を区別するのでしょうか。
「配列へのポインタ」ではなく「配列の先頭要素へのポインタ」を使いたいのであれば、配列の要素を指すポインターもshort* spで問題ありません。drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
Re: 配列へのポインターとシングル変数へのポインターの区別
みけCAT さま
ご教授ありがとうございます。
[]を使って定義した文字列は確かにサイズ的に区別ありますね。
でも malloc(1000 * sizoeof(short))で定義される文字列へのポインターと
short S で定義されている変数へのポインターを区別できるのでしょうか。
また宜しくお願いします
ご教授ありがとうございます。
[]を使って定義した文字列は確かにサイズ的に区別ありますね。
でも malloc(1000 * sizoeof(short))で定義される文字列へのポインターと
short S で定義されている変数へのポインターを区別できるのでしょうか。
また宜しくお願いします
Re: 配列へのポインターとシングル変数へのポインターの区別
単純変数を指す場合も、配列を操作する場合も short *sp で十分です。drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
本質的な事はなんなんでしょうか。
short (*sap)[] が必要なのは、二次元配列を操作する場合です。
次の例は、ポインタを使って値を設定し、配列の値を表示するものです。
#include<stdio.h>
int main(void)
{
short s = 0;
short *sp;
sp = &s;
*sp = 1;
printf(" s = %d\n\n", s);
short sa[4];
sp = sa; // sp = &sa[0]; と同じ
for (int i = 0; i < 4; i++) sp[i] = 10 + i;
for (int i = 0; i < 4; i++) printf(" sa[%d] = %d", i, sa[i]);
printf("\n\n");
short (*sap)[4];
sap = &sa;
for (int i = 0; i < 4; i++) (*sap)[i] = 100 + i; // うれしくない
for (int i = 0; i < 4; i++) printf(" sa[%d] = %d", i, sa[i]);
printf("\n\n");
short saa[3][4];
sap = saa;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 4; j++)
sap[i][j] = 100 + i*10 + j;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 4; j++)
printf(" saa[%d][%d] = %d", i, j, saa[i][j]);
printf("\n");
}
}
Re: 配列へのポインターとシングル変数へのポインターの区別
先頭要素へのポインタではなく,配列へのポインタ側を使うこともたまにあります.
void func1( short *p )
{
//この関数の作業には,要素数5個(以上)の配列がpに指定される必要がある.
//pに配列の先頭を指定してもらう形にしたけど,
//・pが指すのは本当に配列なのかなぁ…
//・要素は本当に5個だけあるのかなぁ…
}
void func2( short (*p)[5] )
{
//この関数の作業には,要素数5個の配列がpに指定される必要がある.
//この形なら,引数に必要とされている事柄がわかりやすく
//func1のような不安はかなりなくなる.
//ただし,引数の型が制限されていることは,関数の使いやすさの面ではデメリットかもしれない
}
Re: 配列へのポインターとシングル変数へのポインターの区別
かずま様、usao 様
丁寧なご解説本当にありがとうございます。
自分が かずま様の書かれたコードをコンパイルして、
実行してみてから、また質問や報告させてください。
どうぞ宜しくお願い致します。
丁寧なご解説本当にありがとうございます。
自分が かずま様の書かれたコードをコンパイルして、
実行してみてから、また質問や報告させてください。
どうぞ宜しくお願い致します。