質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

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

Q&A

解決済

5回答

2440閲覧

C言語 ポインタのポインタとポインタの配列の違い。

退会済みユーザー

退会済みユーザー

総合スコア0

C

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

0グッド

0クリップ

投稿2018/12/30 22:58

目的

二次元配列とダブルポインタを用いてコンソールに

cmd

11 22 33 44 55 66

という数列を出力する処理を作成するにあたって
下記の失敗例と成功例の2つのプログラムを作成しました。
ポインタのポインタ=ポインタの配列ならば失敗例のコードでも動くはずです。
しかし動きません...コンパイルエラーはありませんでしたがフリーズします。
おそらく外部参照を起こしてるなとは思いますが失敗例と成功例の違いが判らないので
その違いをご教授していただけたらなと思い、投稿させていただきました。
どうかよろしくお願いいたします。

失敗例

c

1#include<stdio.h> 2 3int main(void){ 4 5 int a[2][3] = {{1,2,3},{4,5,6}}; 6 int **pa = a; 7 8 int i,j; 9 for(i=0;i<2;i++){ 10 for(j=0;j<3;j++) printf("%d\n",pa[i][j]); 11 } 12 13 getch(); 14 return 0; 15}

成功例

c

1#include<stdio.h> 2 3int main(void){ 4 5 int a[2][3] = {{1,2,3},{4,5,6}}; 6 7 int i,j; 8 for(i=0;i<2;i++){ 9 for(j=0;j<3;j++) printf("%d\n",a[i][j]); 10 } 11 12 getch(); 13 return 0; 14}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

2次元配列は、各要素がメモリにぴったり並んでいるため、最初の添字を変えるとメモリは2次元目以降の要素の数だけ動きます。2次元配列はポインタの配列とは全く構造が異なり、各行を指すポインタが入っているわけではありません

単なるダブルポインタとは型が違い、a[0]を代入できるポインタは、int (*)[3]int3つの配列を指すポインタ)となっています。

投稿2018/12/30 23:09

編集2018/12/30 23:10
maisumakun

総合スコア145183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/31 10:57

ご回答ありがとうございます。 良いお年を。
guest

0

ベストアンサー

正しくはこう:

C

1#include <stdio.h> 2 3int main(void){ 4 5 int a[2][3] = {{1,2,3},{4,5,6}}; 6 int *p[] = { a[0], a[1] }; 7 int **pa = p; 8 9 int i,j; 10 for(i=0;i<2;i++){ 11 for(j=0;j<3;j++) printf("%d\n",pa[i][j]); 12 } 13 14 getch(); 15 return 0; 16}

図説

投稿2018/12/31 00:42

episteme

総合スコア16614

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/31 10:56 編集

どこかのサイトで見たことのある図ですが 皆様の回答の中で一番わかりやすかったので ベストアンサーにしました。 ご回答ありがとうございます。 良いお年を。
episteme

2019/01/01 01:49

まぁこんな図はどこにだってあるでしょねー
guest

0

c

1#include<stdio.h> 2 3int main(void){ 4 5 int a[2][3] = {{1,2,3},{4,5,6}}; 6 int *p = (int*)a; 7 8 int i,j; 9 for(i=0;i<2*3;i++){ 10 printf("%d\n",p[i]); 11 } 12 13 getch(); 14 return 0; 15} 16 17/* => 181 192 203 214 225 236 24*/

こういうことです。

投稿2018/12/30 23:33

asm

総合スコア15147

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/31 10:57

ご回答ありがとうございます。 良いお年を。
guest

0

c

1#include<stdio.h> 2 3int main(void){ 4 5 int a[2][3] = {{1,2,3},{4,5,6}}; 6 int *pa = a[3]; 7 8 int i,j; 9 for(i=0;i<2;i++){ 10 for(j=0;j<3;j++) printf("%d\n",(*pa)++); 11 } 12 13 getch(); 14 return 0; 15}

これなら動きます。

投稿2018/12/30 23:29

maiko0318

総合スコア876

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/31 10:57

ご回答ありがとうございます。 良いお年を。
guest

0

ポインタのポインタってあまり(たぶん)使ったことないので、結果だけですが・・・
clang version 8.0.0 (-std=c11 -Weverything)の環境ではワーニングが出ます。

text

1t166635.c:6:11: warning: incompatible pointer types initializing 'int **' with an expression of 2 type 'int [2][3]' [-Wincompatible-pointer-types] 3 int **pa = a; 4 ^ ~

ポインタがコンパチじゃない!

投稿2018/12/30 23:26

cateye

総合スコア6851

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/12/31 10:57

ご回答ありがとうございます。 良いお年を。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問