まぬねこの足跡。。。

備忘録+たのしさ+ひっそりと

C言語 ポインタ

ポインタ

ポインタ

  • ポインタ型:変数の型のアドレス版
  • ポインタ値:変数のアドレスの数値
  • ポインタ変数:アドレスを記憶する変数

ちょこっとメモ

voidポインタ

void*型
全変数アドレスに対応できる。
ただし、キャストしないと値を取得できない。

ポインタ宣言


※Nullで初期化:宣言時、自動初期化されないので、いい加減な値がはいっている。

int *p = NULL;
int* p = NULL;
int *p; ←pのみはポインタ変数 int *はポインタ型
int A;
p = &A; ←pにAのアドレスを代入(pの中身はポインタ値)
printf("p = %p\n", p);
printf("&A= %p\n", &A);

表示イメージ

p = 0x7ffc72d63f5c
&i = 0x7ffc72d63f5c ←pのポインタ値と同一アドレス

ちょこっとメモ

Null

数字の0とはちがうもの。
中身がないことを表す。

変身するポインタ

通常の値を表現

int *p;
*p;

ポインタ値(アドレス)を表現

int *p;
p;

例)

int *p;
int A = 0;
p = &A; ←ポインタ値に変数Aのアドレスを代入
*p = 100; ←ポインタ値の変数に100を代入=変数Aに代入
printf("*p = %d\n", *p);
printf("p = %p\n", p);
printf("A = %d\n", A);
printf("&A = %p\n", &A);

表示イメージ

*p = 100 ←ポインタ値が変数A(アドレス)の中身を参照
p = 0x7fff39fe66ec
A = 100
&A = 0x7fff39fe66ec ←pのポインタ値と同一アドレス

ポインタ演算子

ポインタ変数に加減算を行って配列の要素を使う

*(ポインタ変数 + 要素番号)

※先頭の「*」で「ポインタ変数+要素数」(アドレス)を中身(値)に変更する

int *p;
int sum = 0, A[5] = {10,20,30,40,50};

p = A;
for (int i = 0; i < 5; i++){
    sum += *(p + i);
}

printf("%d\n", sum);

高速版

int *p;
int sum = 0, A[5] = {10,20,30,40,50};

for (p = A; p != &A[5]; p++){
    sum += *p;
}

printf("%d\n", sum);

表示イメージ

150

ダプルポインタ

ポインタのポインタ

int **pp;
int *p;
int a = 100;

pp = &p;
p = &a; 

printf("**pp = %d\n", **pp);
printf("*pp = %p\n", *pp);
printf("pp = %p\n", pp);
printf("*p = %d\n", *p);
printf("p = %p\n", p);
printf("&p = %p\n", &p);
printf("a = %d\n", a);
printf("&a = %p\n", &a);

表示イメージ

**pp = 100 ← **pp=*p=変数aの値
*pp = 0x7ffc3253b8dc ←*pp=p=aのアドレス
pp = 0x7ffc3253b8e0 ←pp=pポインタ変数のアドレス
*p = 100 ←*p=変数aの値
p = 0x7ffc3253b8dc ←p=変数aのアドレス
&p = 0x7ffc3253b8e0
a = 100
&a = 0x7ffc3253b8dc

構造体型 ポインタ変数

構造体型 ポインタ変数での各要素へアクセス

  • (*構造体ポインタ変数名).要素名
  • 構造体ポインタ変数名->要素名
typedef struct member_kata
{
    int team;
    int number;
    char name[50];
} member;

int main(void){
    member data;
    member *pdata;

    pdata = &data;

    (*pdata).number= 10;
    又は。
    pdata->number= 10;
}