2
4

More than 5 years have passed since last update.

c言語の配列へのポインタ改良版

Posted at

前回の投稿で「charの配列へのポインタに代入」した値を表示させた時に,意図しない結果になった.
投稿した数十分後に回答を得られた.自分で解決したわけでは無くてlong_long_floatさんにコメントを付けてもらえたため正しい表示ができました.
ありがとうございます.

早速ソースコードと結果を載せます.

intの配列へのポインタ

#include <stdio.h>

int main(void){
    int itmp[3] = {1, 2, 3};
    int (*p3tmp)[3];

    p3tmp = &itmp;
    printf("p3tmp[%d][%d][%d]\n", *p3tmp[0], *p3tmp[1], *p3tmp[2] );
    printf("p3tmp[%d][%d][%d]\n", *(p3tmp[0]), *(p3tmp[1]), *(p3tmp[2]) );
    printf("p3tmp[%d][%d][%d]\n", (*p3tmp)[0], (*p3tmp)[1], (*p3tmp)[2] );
    printf("p3tmp[%d][%d][%d]\n", p3tmp[0][0], p3tmp[0][1], p3tmp[0][2] );

    return 0;
}

スクリーンショット 2016-01-17 15.16.22.jpg

指摘通り*p3tmp[0]*(p3tmp[0])は同じ表示内容になりました.
そして訂正後は代入した内容と同じ内容が表示されました^^
コメントは(*p3tmp)[x]にすれば意図した内容が表示されるとのことで表示に成功しました.

ポインタの配列

#include <stdio.h>

int main(void){
    char *ptmp[] = {
                    "hello",
                    "World",
                    "hello World"
                };
    char **phoge;

    printf("ptmp[0]\t\t[%s]\n", ptmp[0] );
    printf("ptmp[1]\t\t[%s]\n", ptmp[1] );
    printf("ptmp[2]\t\t[%s]\n", ptmp[2] );
    printf("-----------------------------\n");
    phoge = ptmp;
    printf("phoge[0]\t\t[%s]\n", phoge[0] );
    printf("phoge[1]\t\t[%s]\n", phoge[1] );
    printf("phoge[2]\t\t[%s]\n", phoge[2] );
    printf("-----------------------------\n");

    return 0;
}

※ソースコードに色が付かないorz

文字列を配列にいくつも格納し,メッセージ出力するときに活用する.
メッセージが固定されている場合に有効な技だと思っている.

個人的に*ptmp[]は多次元配列だと思っているのだが,宣言すら失敗してしまう.
データ型 配列名[要素数1][要素数2];
要素数がわからないため空にした状態で宣言するから失敗するのだが・・・.
2次元配列を宣言して代入しようとしても失敗する.

    char pptmp1[3][1];
    char *pptmp2[3];
    pptmp1 = ptmp;
    pptmp2 = ptmp;
error: array type 'char [3][1]' is not assignable
        pptmp1 = ptmp;
        ~~~~~~ ^
error: array type 'char *[3]' is not assignable
        pptmp2 = ptmp;
        ~~~~~~ ^

残念だがchar **phoge;の宣言をして代入できたため問題ないと判断する.

参考サイト

余談

汎用ポインタなるものがあるようだが,また後日だな^^

来月から違う現場だな.
現場が変わるのは派遣社員の悩みどころだな^^

2
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
4