LoginSignup
7
6

More than 5 years have passed since last update.

C言語のポインタ

Last updated at Posted at 2016-01-17

今月の5日に新しい派遣先で仕事をすることになった.しかもC言語のポインタを多用する現場のようで,課題を与えられて1週間の試用期間に解かなければならない.
今までの派遣先はC言語を扱っていたが,今回の現場のように筆記試験や実技試験を与えられることはなかった.
本当にポインタに特化した課題のため,知識が無ければ解けない問題ばかり.しかし,学生時代の課題のようなものなのでたいしたことは無い.
たいしたことは無いが,やはりポインタに特化しているため記憶している知識ではこなせないことがわかった.そのため,先日の3連休でポインタに関する書籍を読み返した.
ネットを駆使してポインタに関する説明をしているサイトも見つけた.
結論は,今月でクビになったこと...
それでも理解したこをちょろっと掲載する.
掲載理由は,ネット検索でポインタを完全に理解していないサイトを見つけたため,私がいかに知識を得ているかを自慢したかったから.(痛い人間なので,気にしないこと^^)

全体のソースコード

#include <stdio.h>

int main(int argc, char *args[]){
    int ione = 123;
    int itmp[3] = {1, 2, 3};
    char *str = "hello_world!!";
    char tmp[] = "hello world!!";
    char *x[256];
    char *y;
    int *i3tmp;
    int (*p3tmp)[3];

    x[0] = (char *)&ione;
    x[1] = str;
    x[2] = tmp;
    y = tmp;
    i3tmp = itmp;
    p3tmp = &itmp;
    printf("ione:[%d]\n", *x[0] );
    printf("str[%s]\n", x[1] );
    printf("tmp[%s]\n", x[2] );
    printf("tmp[%s]\n", y );
    printf("i3tmp[%d][%d][%d]\n", i3tmp[0], i3tmp[1], i3tmp[2] );
    printf("p3tmp[%d][%d][%d]\n", *p3tmp[0], *p3tmp[1], *p3tmp[2] );
    return 0;
}

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

charへのポインタ型変数に代入

#include <stdio.h>

int main(int argc, char *args[]){
    char tmp[] = "hello world!!";
    char *y;

    y = tmp;
    printf("tmp[%s]\n", y );
    y = &tmp[0];
    printf("tmp[%s]\n", y );
    return 0;
}

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

文字列を配列に代入後,それをcharへのポインタ型変数に代入している.
表現方法はtmp&tmp[0]のどちらでもかまわない.
しかし&tmpの場合は意味が変わるため気をつけること(配列へのポインタ).

charへのポインタの配列に代入

#include <stdio.h>

int main(int argc, char *args[]){
    int ione = 123;
    char *str = "hello_world!!";
    char tmp[] = "hello world!!";

    char *x[256];

    x[0] = (char * )&ione;
    x[1] = str;
    x[2] = tmp;
    printf("ione:[%d]\n", *x[0] );
    printf("str[%s]\n", x[1] );
    printf("tmp[%s]\n", x[2] );

    return 0;
}

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

一つ目:int型の変数(ione)に数字を代入している.
二つ目:charへのポインタ型の変数(str)に文字列を代入している.
三つ目:char型の配列(tmp)に文字列を代入している.
それらをcharへのポインタの配列に代入している.そしてprintf関数で表示させている.

intの配列へのポインタに代入

#include <stdio.h>

int main(int argc, char *args[]){
    int itmp[3] = {1, 2, 3};
    int *i3tmp;
    int (*p3tmp)[3];

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

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

一つ目:数字をint型の配列(itmp)に代入している.
二つ目:intへのポインタ型の変数(i3tmp)を宣言している.
三つ目:intの配列へのポインタの変数(p3tmp)を宣言している.
宣言したそれぞれの変数にitmpを代入して表示している.
しかし,表示の内容がおかしい(*p3tmp[1], *p3tmp[2]).

改めて原因を探りますか(こんなことだから今月末までの契約なのだろうorz).

参考サイト

7
6
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
7
6