Cのポインタとかすっかり忘れてるなあ

さすがにポインタの意味は覚えてるけど、Cでの構文、関数ポインタのtypedefとかsizeofとか忘れてた。

typedef int (*main_ptr)(int argc, char* argv[]);

とか(引数の名前は無くてもいいがあってもいい?)。sizeofは関数のように括弧がいることとか。

軽くコードを書いてみたけど、gccでいろいろオプションをつけて警告が出ないようにするのとか結構大変だなあ。

#include <stdio.h>

struct foo {
  char a;
  char b;
  char c;
};

int main(int argc, char** argv) {
  //typedef int* ptr;
  //typedef struct foo*  ptr;
  typedef int (*ptr) (int argc, char* argv[]);
  ptr p1 = &main;
  if (argc == 0) {
    printf("rec \n");
    return 0;
  }
  (*p1)(0, 0);
  printf("addr: %ld\n", (long) p1);
  p1++;
  printf("addr: %ld\n", (long) p1);
  printf("size: %ld\n", (long) sizeof (ptr));
  printf("size: %ld\n", (long) sizeof (p1));
  printf("size: %ld\n", (long) sizeof (long));
  printf("size: %ld\n", (long) sizeof (int*));
  printf("size: %ld\n", (long) sizeof (char[3]));
  printf("size: %ld\n", (long) sizeof (struct foo));
  return 0;
}
$ gcc -Wextra -Wall -Wno-unused-parameter -std=c99 -m32 main.c
$ ./a.out
rec
addr: 134513572
addr: 134513573
size: 4
size: 4
size: 4
size: 4
size: 3
size: 3

これも単に-m64で警告が出ないというだけだが。ポインタ/整数関係でプロセッサ依存を避ける場合、stdint.hとinttypes.hを使う必要があるらしい。

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>


int main(int argc, char** argv) {
  intptr_t p1 = 0;
  printf("addr: %"PRIdPTR"\n", p1);
  p1++;
  printf("addr: %"PRIdPTR"\n", p1);
  printf("size: %"PRIdPTR"\n", sizeof (intptr_t));
  return 0;
}