ポインタ
マクロ
構造体
ファイル操作
ポインタ(変数)
#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)動的にメモリを割り振れる
ポインタ(配列)
#include<stdio.h>
int main()
{
char arr[100] = "hello,world";
char* p = arr;
printf("arr = %s\n",p);
return 0;
}
配列名はその配列の先頭のアドレスを指す。
関数ポインタ
#include<stdio.h>
void function(void)
{
printf("関数ポインタを用いています\n");
}
int main()
{
void (*func_p)(void) = function;
func_p(); /*(*func_p)()でも可能*/
return 0;
}
戻り値の型 (*変数名)(引数リスト) = 関数名;
変数名(引数,引数....);
マクロ
#include<stdio.h>
#define MAX 100
int main()
{
printf("上限は%dです\n",MAX);
return 0;
}
#define 記号定数名 置き換え後の文字の並び
ソース上で何度も現れる意味のある定数は、そのまま使わずに記号定数としておいた方が分かりやすく、また、後から修正するときに楽になる。
マクロ関数
#include<stdio.h>
#define COMPUTE(r) r*r*3.14 /* 円の面積を計算。r=半径 */
int main()
{
printf("半径%dのときの面積は%dです\n",3,COMPUTE(3));
return 0;
}
マクロ関数は置き換えを行うだけなので、関数の呼出時間がかからない。
注意点がいくつかあり、多用は避けるべき。
構造体
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;
}
構造体(ポインタを用いたアクセス)
#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;
}
構造体(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;
}
ファイル操作(入力)
#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を返す。
ファイル操作(出力)
#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;
}
カレントディレクトリ内にファイルが存在した場合でも、問答無用で上書きする。
エラー発生時には強制終了させるべき。
最終更新:2008年09月02日 00:11