質問編集履歴

6 修正

strike1217

strike1217 score 577

2017/01/24 17:33  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = &q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);
おまけに2次元配列のようにアクセスもできています・・・・!?
正直、よくわかってないです。
どなたか教えてください!
> [追記]
int array[4][10]
int (*arp)[10] = array;
char array[4][10]
char (*arp)[10] = array;
たとえば、こうなった場合・・・
arpという**1つのポインタ**が**4つの配列の先頭アドレス**を指しているということですよね?
・・・・??
なんかおかしくないですかね?
たった1つしかないポインタが同時に4つのアドレスを指しているなんて・・・
どういうことですか??
> [追記2]
ポインタのポインタの初期化について、考察してもらっている方もいらっしゃるのですが、
int array[4][10]
int (*arp)[10] = array; ← arpはポインタで要素数4つの配列の先頭アドレスを持っていると思います。
char array[4][10]
char (*arp)[10] = array; ← arpはポインタで要素数4つの配列の先頭アドレスを持っていると思います。
つまり・・・・・一次元配列・・・ということになりますよね??
arp[0], arp[1] ・・というのが、要素数10個ある配列の先頭を表すことで、あたかも2次元配列のようになる
と解釈しました。
しかし、
```
char ii[4] = "GHYU";
char *qq = ii;
char **pp = &qq;  // char *pp = &qq; これは無理!
```
これは、問題がありません。
ポインタのポインタを初期化できています。
char (*arp)[10]; はこれに似ていと思います。
あたかも「char ii[4] = "GHYU";」+「char *qq = ii;」これを1つにしたような感じです。
G, H, Y, U が要素数10個配列の先頭の文字だと想像してください。
なのに、最初の質問のように・・・
char (*q)[100] = buf;
p = &q
これができない理由が・・・見当たらないです。
「データ構造が違うから初期化できない」
上記のプログラムができているので、むしろ初期化できないとおかしいような気がします。
上記のプログラムができているので、むしろ初期化できないとおかしいような気がします。
> [修正]
大変申し訳ありません。
int型とchar型を混合してしまいました。
修正しまいした。
**すべてchar型です。**
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

5 修正

strike1217

strike1217 score 577

2017/01/24 16:43  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = &q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);
おまけに2次元配列のようにアクセスもできています・・・・!?
正直、よくわかってないです。
どなたか教えてください!
> [追記]
int array[4][10]
int (*arp)[10] = array;
たとえば、こうなった場合・・・
arpという**1つのポインタ**が**4つの配列の先頭アドレス**を指しているということですよね?
・・・・??
なんかおかしくないですかね?
たった1つしかないポインタが同時に4つのアドレスを指しているなんて・・・
どういうことですか??
> [追記2]
ポインタのポインタの初期化について、考察してもらっている方もいらっしゃるのですが、
int array[4][10]
int (*arp)[10] = array; ← arpはポインタで要素数4つの配列の先頭アドレスを持っていると思います。
つまり・・・・・一次元配列・・・ということになりますよね??
arp[0], arp[1] ・・というのが、要素数10個ある配列の先頭を表すことで、あたかも2次元配列のようになる
と解釈しました。
しかし、
```
char ii[4] = "GHYU";
char *qq = ii;
char **pp = &qq;  // char *pp = &qq; これは無理!
```
これは、問題がありません。
ポインタのポインタを初期化できています。
char (*arp)[10]; はこれに似ていと思います。
あたかも「char ii[4] = "GHYU";」+「char *qq = ii;」これを1つにしたような感じです。
G, H, Y, U が要素数10個配列の先頭の文字だと想像してください。
なのに、最初の質問のように・・・
char (*q)[100] = q;
char (*q)[100] = buf;
p = &q
これができない理由が・・・見当たらないです。
「データ構造が違うから初期化できない」
上記のプログラムができているので、むしろ初期化できないとおかしいような気がします。
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

4 修正

strike1217

strike1217 score 577

2017/01/24 16:43  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = q;
   p = &q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);
おまけに2次元配列のようにアクセスもできています・・・・!?
正直、よくわかってないです。
どなたか教えてください!
> [追記]
int array[4][10]
int (*arp)[10] = array;
たとえば、こうなった場合・・・
arpという**1つのポインタ**が**4つの配列の先頭アドレス**を指しているということですよね?
・・・・??
なんかおかしくないですかね?
たった1つしかないポインタが同時に4つのアドレスを指しているなんて・・・
どういうことですか??
> [追記2]
ポインタのポインタの初期化について、考察してもらっている方もいらっしゃるのですが、
int array[4][10]
int (*arp)[10] = array; ← arpはポインタで要素数4つの配列の先頭アドレスを持っていると思います。
つまり・・・・・一次元配列・・・ということになりますよね??
arp[0], arp[1] ・・というのが、要素数10個ある配列の先頭を表すことで、あたかも2次元配列のようになる
と解釈しました。
しかし、
```
char ii[4] = "GHYU";
char *qq = ii;
char **pp = &qq;  // char *pp = &qq; これは無理!
```
これは、問題がありません。
ポインタのポインタを初期化できています。
char (*arp)[10]; はこれに似ていと思います。
あたかも「char ii[4] = "GHYU";」+「char *qq = ii;」これを1つにしたような感じです。
G, H, Y, U が要素数10個配列の先頭の文字だと想像してください。
なのに、最初の質問のように・・・
char (*q)[100] = buf;
char (*q)[100] = q;
p = &q
これができない理由が・・・見当たらないです。
「データ構造が違うから初期化できない」
上記のプログラムができているので、むしろ初期化できないとおかしいような気がします。
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

3 追記

strike1217

strike1217 score 577

2017/01/24 16:20  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);
おまけに2次元配列のようにアクセスもできています・・・・!?
正直、よくわかってないです。
どなたか教えてください!
> [追記]
int array[4][10]
int (*arp)[10] = array;
たとえば、こうなった場合・・・
arpという**1つのポインタ**が**4つの配列の先頭アドレス**を指しているということですよね?
・・・・??
なんかおかしくないですかね?
たった1つしかないポインタが同時に4つのアドレスを指しているなんて・・・
どういうことですか??
どういうことですか??
> [追記2]
ポインタのポインタの初期化について、考察してもらっている方もいらっしゃるのですが、
int array[4][10]
int (*arp)[10] = array; ← arpはポインタで要素数4つの配列の先頭アドレスを持っていると思います。
つまり・・・・・一次元配列・・・ということになりますよね??
arp[0], arp[1] ・・というのが、要素数10個ある配列の先頭を表すことで、あたかも2次元配列のようになる
と解釈しました。
しかし、
```
char ii[4] = "GHYU";
char *qq = ii;
char **pp = &qq;  // char *pp = &qq; これは無理!
```
これは、問題がありません。
ポインタのポインタを初期化できています。
char (*arp)[10]; はこれに似ていと思います。
あたかも「char ii[4] = "GHYU";」+「char *qq = ii;」これを1つにしたような感じです。
G, H, Y, U が要素数10個配列の先頭の文字だと想像してください。
なのに、最初の質問のように・・・
char (*q)[100] = buf;
これができない理由が・・・見当たらないです。
「データ構造が違うから初期化できない」
上記のプログラムができているので、むしろ初期化できないとおかしいような気がします。
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

2 追記

strike1217

strike1217 score 577

2017/01/23 15:29  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);
おまけに2次元配列のようにアクセスもできています・・・・!?
正直、よくわかってないです。
どなたか教えてください!
どなたか教えてください!
> [追記]
int array[4][10]
int (*arp)[10] = array;
たとえば、こうなった場合・・・
arpという**1つのポインタ**が**4つの配列の先頭アドレス**を指しているということですよね?
・・・・??
なんかおかしくないですかね?
たった1つしかないポインタが同時に4つのアドレスを指しているなんて・・・
どういうことですか??
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

1 追記

strike1217

strike1217 score 577

2017/01/23 11:40  投稿

char (*p)[10]の使い道
char (*p)[10];
>>>char型の要素を10個持つ配列へのポインタ!
これの使い道がわかりません。
```C
int (*arp)[10];
// アドレスを入れるときは以下のように入れます。
int array_ten[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
arp = &array_ten;
```
普通に、int *arp = array_ten; で良いような気がします。
わざわざ要素数が固定のポインタに渡す必要性が見えません。
「あ!ポインタのポインタの初期化に使えるかな?」と思い、以下のようにしてみました。
```C
char buf[3][100] = {
       "nononono!!",
       "I love you!",
       "Thanks"
   };
   char **p;
   // char *q[3] = {buf[0], buf[1], buf[2]}; こっちは成功
   char (*q)[100] = buf;
   p = q;
```
これをやると、warningが出てきて、さらに落ちます・・・・
なぜかわかりませんが・・・
char (*p)[10];
関数に2次元配列を渡す時と、列を動的確保したい時ぐらいしか、出番がないような気がするんですが・・・・
char (*p)[10];
この子の他の使い方はあります??
プログラムの例を見ているとよく出てきます。
 
printf("p[1] : %p, p[1][0] : %p\n", p[1], &p[1][0]);  
おまけに2次元配列のようにアクセスもできています・・・・!?  
正直、よくわかってないです。
どなたか教えてください!
  • C++

    5242 questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • C

    5375 questions

    C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る