配列へのポインターとシングル変数へのポインターの区別

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

配列へのポインターとシングル変数へのポインターの区別

#1

投稿記事 by drone » 8年前

short 変数 Sへのポインター は

コード:

short* sp = &S; 
のように定義されると思いますが、

では、
shortメンバーの数が1000くらいあるshort配列へのポインターを
どう定義すれば良いのでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列へのポインターとシングル変数へのポインターの区別

#2

投稿記事 by みけCAT » 8年前

関数ポインターは

コード:

void (*hoge)(void) = foo;
同様に、配列へのポインターは

コード:

short (*sap)[1000] = SA;
ただし、これはメンバーの数が「1000くらい」ではなく「1000」の配列へのポインターです。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

drone

Re: 配列へのポインターとシングル変数へのポインターの区別

#3

投稿記事 by drone » 8年前

みけCAT さま
有難うございます。

コード:

short (*sap)[1000] = SA;
これってけっこう気取った表現ですね(笑)。。。
コンピューターは本当に
「short (*sap)[1000] 」と 「 short (*sap)[10] 」を区別するのでしょうか。

自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
本質的な事はなんなんでしょうか。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 配列へのポインターとシングル変数へのポインターの区別

#4

投稿記事 by みけCAT » 8年前

drone さんが書きました:コンピューターは本当に
「short (*sap)[1000] 」と 「 short (*sap)[10] 」を区別するのでしょうか。
sizeof(*sap)を取ると、配列なので、前者ではshort1000個分のサイズ、後者ではshort10個分のサイズになるはずです。
drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
「配列へのポインタ」ではなく「配列の先頭要素へのポインタ」を使いたいのであれば、配列の要素を指すポインターもshort* spで問題ありません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

drone

Re: 配列へのポインターとシングル変数へのポインターの区別

#5

投稿記事 by drone » 8年前

みけCAT さま
ご教授ありがとうございます。
[]を使って定義した文字列は確かにサイズ的に区別ありますね。
でも malloc(1000 * sizoeof(short))で定義される文字列へのポインターと
short S で定義されている変数へのポインターを区別できるのでしょうか。

また宜しくお願いします

かずま

Re: 配列へのポインターとシングル変数へのポインターの区別

#6

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

drone さんが書きました:自分は長い間、ずーと 変数short SA[...] へのポインターと short Sへのポインターを
同じ定義[short* sp]にして利用してきたが、特にトラブル等が起きていないようです。
本質的な事はなんなんでしょうか。
単純変数を指す場合も、配列を操作する場合も 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");
    }
}
実行結果

コード:

  s = 1

  sa[0] = 10  sa[1] = 11  sa[2] = 12  sa[3] = 13

  sa[0] = 100  sa[1] = 101  sa[2] = 102  sa[3] = 103

  saa[0][0] = 100  saa[0][1] = 101  saa[0][2] = 102  saa[0][3] = 103
  saa[1][0] = 110  saa[1][1] = 111  saa[1][2] = 112  saa[1][3] = 113
  saa[2][0] = 120  saa[2][1] = 121  saa[2][2] = 122  saa[2][3] = 123

アバター
usao
記事: 1889
登録日時: 12年前
連絡を取る:

Re: 配列へのポインターとシングル変数へのポインターの区別

#7

投稿記事 by usao » 8年前

先頭要素へのポインタではなく,配列へのポインタ側を使うこともたまにあります.

コード:

void func1( short *p )
{
  //この関数の作業には,要素数5個(以上)の配列がpに指定される必要がある.
  //pに配列の先頭を指定してもらう形にしたけど,
  //・pが指すのは本当に配列なのかなぁ…
  //・要素は本当に5個だけあるのかなぁ…
}

void func2( short (*p)[5] )
{
  //この関数の作業には,要素数5個の配列がpに指定される必要がある.
  //この形なら,引数に必要とされている事柄がわかりやすく
  //func1のような不安はかなりなくなる.
  //ただし,引数の型が制限されていることは,関数の使いやすさの面ではデメリットかもしれない
}

drone

Re: 配列へのポインターとシングル変数へのポインターの区別

#8

投稿記事 by drone » 8年前

かずま様、usao 様
丁寧なご解説本当にありがとうございます。

自分が かずま様の書かれたコードをコンパイルして、
実行してみてから、また質問や報告させてください。

どうぞ宜しくお願い致します。

返信

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