ポインタ

マクロ

構造体

ファイル操作



ポインタ(変数)

#include<stdio.h>
int main()
{
   int i = 5;    /*int型の変数iがメモリ上に確保される*/
   int* p = &i; /*iが確保されているメモリ番地を代入*/
   printf("iの番地:%p\n",p);
   printf("iの番地に記録されている値:%d\n",*p);
   return 0;
}
変数がとてつもなく大きい容量だった場合、コピーするのも一苦労。
ならコピーなんてせずに「その変数がある場所」を教えてやればコピーせずに済む。
図書館にある本を全て持ってくるより、図書館に行った方が早い。

ポインタを使う利点:
(1)大きな配列や構造体を扱いやすい
(2)リストや木といったデータ構造を構築できる
(3)関数の引数や返り値を,アドレスで受け渡すことができる
(4)動的にメモリを割り振れる
top

ポインタ(配列)

#include<stdio.h>
int main()
{
   char arr[100] = "hello,world";
   char* p = arr;
   printf("arr = %s\n",p);
   return 0;
}
配列名はその配列の先頭のアドレスを指す。
top

関数ポインタ

#include<stdio.h>
void function(void) 
{
     printf("関数ポインタを用いています\n");
}
int main()
{
   void (*func_p)(void) = function;
   func_p(); /*(*func_p)()でも可能*/
   return 0;
}

  • 関数ポインタの書式:
戻り値の型 (*変数名)(引数リスト) = 関数名;
変数名(引数,引数....);
top


マクロ

#include<stdio.h>
#define MAX 100
int main()
{
   printf("上限は%dです\n",MAX);
   return 0;
}
  • マクロの定義:
#define 記号定数名 置き換え後の文字の並び
ソース上で何度も現れる意味のある定数は、そのまま使わずに記号定数としておいた方が分かりやすく、また、後から修正するときに楽になる。
top

マクロ関数

#include<stdio.h>
#define COMPUTE(r) r*r*3.14   /* 円の面積を計算。r=半径 */
int main()
{
    printf("半径%dのときの面積は%dです\n",3,COMPUTE(3));
    return 0;
}
マクロ関数は置き換えを行うだけなので、関数の呼出時間がかからない。
注意点がいくつかあり、多用は避けるべき。
top

構造体

  • 構造体の宣言
struct タグ名 {
   変数;
   変数;
};
複数の変数を一つにまとめたもの。
各変数へのアクセスは「.」演算子を用いるか、間接的にアクセスする場合は「->」演算子を用いる。

#include<stdio.h>
struct __data__ {
    int num;
    char ch;
};
int main()
{
   struct __data__ a;    //struct __data__型の変数aの宣言
   a.num = 1;          //構造体内の変数numにアクセス
   a.ch  = 'a';         //構造体内の変数chにアクセス
   printf("a.num = %d\n",a.num);
   printf("a.ch = %c\n",a.ch);           
   return 0;
}
top

構造体(ポインタを用いたアクセス)

#include<stdio.h>
struct __data__ {
    int num;
    char ch;
};
int main()
{
   struct __data__ a; //struct __data__型の変数aの宣言
   struct __data__ *p = &a;
   p->num = 1;          //構造体内の変数numにアクセス
   p->ch  = 'a';        //構造体内の変数chにアクセス
   printf("a.num = %d\n",p->num);
   printf("a.ch = %c\n",p->ch);           
   return 0;
}
top

構造体(typedefを用いた定義)

#include<stdio.h>
typedef struct __data__ {
    int num;
    char ch;
}Data;
int main()
{
  Data a;              //Data型の変数aの宣言
   a.num = 1;          //構造体内の変数numにアクセス
   a.ch  = 'a';        //構造体内の変数chにアクセス
   printf("a.num = %d\n",a.num);
   printf("a.ch = %c\n",a.ch);           
   return 0;
}
top

ファイル操作(入力)

#include<stdio.h>
int main()
{
   FILE* fp;
   char ch;
   if ((fp = fopen(ファイル名,"r")) == NULL) {
       〜エラー時の処理〜
   }
   while ( (ch = fgetc(fp)) !=  EOF)  `
       putchar(ch);
   fclose(fp);
   return 0;
}
FILE構造体を用いて処理を行う。
カレントディレクトリ内に対象のファイルが無い場合にはNULLを返す。
top

ファイル操作(出力)

#include<stdio.h>
int main()
{
   FILE* fp;
   char *str = "abcdefg";
   if ((fp = fopen(ファイル名,"w")) == NULL) {
       〜エラー時の処理〜
   }
   while (*str != '\0') {
       fputc(*str,fp);
       str++;
   }
   fclose(fp);
   return 0;
}
カレントディレクトリ内にファイルが存在した場合でも、問答無用で上書きする。
エラー発生時には強制終了させるべき。
top
最終更新:2008年09月02日 00:11