配列へのポインターとシングル変数へのポインターの区別
Posted: 2017年6月24日(土) 09:45
sizeof(*sap)を取ると、配列なので、前者ではshort1000個分のサイズ、後者ではshort10個分のサイズになるはずです。drone さんが書きました:コンピューターは本当に
「short (*sap)[1000] 」と 「 short (*sap)[10] 」を区別するのでしょうか。
「配列へのポインタ」ではなく「配列の先頭要素へのポインタ」を使いたいのであれば、配列の要素を指すポインターもshort* spで問題ありません。drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
単純変数を指す場合も、配列を操作する場合も short *sp で十分です。drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
本質的な事はなんなんでしょうか。
#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");
}
}
void func1( short *p )
{
//この関数の作業には,要素数5個(以上)の配列がpに指定される必要がある.
//pに配列の先頭を指定してもらう形にしたけど,
//・pが指すのは本当に配列なのかなぁ…
//・要素は本当に5個だけあるのかなぁ…
}
void func2( short (*p)[5] )
{
//この関数の作業には,要素数5個の配列がpに指定される必要がある.
//この形なら,引数に必要とされている事柄がわかりやすく
//func1のような不安はかなりなくなる.
//ただし,引数の型が制限されていることは,関数の使いやすさの面ではデメリットかもしれない
}