1. 記述の基本
2. ポインタを理解する
3. 構造体・ファイル入出力
4. 簡易データベースを作ろう
p00.c | |
#include <stdio.h> int func1(int); int main() { int hige1; hige1 = func1(10); printf( "\nNumber\t%d\n\n", hige1 ); return 0; } int func1( int value ) { value = value * 2; return value; } |
自分で定義した関数の宣言 何はともあれmainから (自動)変数の宣言 関数を定義する 値(int)を返す.上2行まとめて,return value*2; としてもよい. |
 
p00a.c | |
#include <stdio.h> double func1(int); int main(){ double hige1; hige1 = func1(11); printf( "\nNumber\t%lf\n\n", hige1 ); return 0; } double func1( int value ) { double ret; ret = (double)value * 1.7; return ret; } |
func1の型をdouble型とする(引数はint型のままにする) hige1もdouble型に 右辺と左辺の型が一致してます 書式もdouble型に対応 関数を定義する 「型キャスト」で両辺の型が一致.(今回はその場しのぎ..) 値(double型)を返す |
 
p01.c | |
#include <stdio.h> int main() { int value = 10; int *a; printf("&value\t--> %p\n", &value); printf("&a\t--> %p\n", &a ); a = &value; printf("*a\t--> %d\n", *a ); *a = 25; printf("value \t--> %d\n", value ); return 0; } |
value のアドレスを確認 a のアドレスを確認 valueのアドレスをaに渡す (ポインタ変数aを経由して)valueの内容を表示する (ポイント変数aを経由して)valueの内容を書き換える |
 
p02.c | |
#include <stdio.h> int func1(int *); int main() { int hige1; hige1 = 10; func1( &hige1 ); printf( "\nNumber\t%d\n\n", hige1 ); return 0; } int func1( int *value ) { *value = (*value) * 2; } |
自分で定義した関数の宣言.引数の型に注意! 何はともあれmainから (自動)変数の宣言 初期値を10としておく. hige1のアドレスを func1 の引数とする. 関数を定義する. *value(つまりhige1の値)自身を2倍に更新する. |
 
p03.c | |
#include <stdio.h> int main() { int value[5], i; int *a; for ( i = 0 ; i < 5 ; i++ ) { value[i] = 10*(i+1); printf("\n%d", value[i]); } printf("\n-----"); for ( a = &value[0] ; a != &value[5] ; a++ ) { printf("\n%d", *a); } printf("\n\n"); return 0; } |
配列表現 value[i]の内容表示 単なる境界線 ポインタ表現 value[i]の内容表示 |
 
p04.c | |
#include <stdio.h> void swap( int *suwa, int *haru ) { int value; value = *suwa; *suwa = *haru; *haru = value; } int main() { int a=5, b=10; printf("\n%d\t%d", a, b ); swap( &a, &b ); printf("\n-----"); printf("\n%d\t%d\n\n", a, b ); return 0; } |
swap関数を使って,二つの変数の値を入れ換えます. 入れ換え前 aとbのアドレスを渡す 単なる境界線 入れ換え後 |
 
p05.c | |
#include <stdio.h> #include <stdlib.h> int main() { int *hige; int num=10, i; hige = malloc( sizeof( int) * num ); for ( i = 0 ; i < num ; i++ ) { *(hige +i) = i*10; printf("%d\n", hige[i] ); } return 0; } |
mallocを使うためにインクルードしておく. malloc関数を使ってメモリを確保する. 確保する大きさは,int型(4or8バイト)サイズのnum倍. hige[i]=i*10; と同じ. *(hige +i) としても同じ |
 
p06.c | |
#include <stdio.h> #include <stdlib.h> typedef struct { char *name; int age; double height; double weight; } Person; int main() { Person p[2]; int i; for ( i = 0 ; i < 2 ; i++ ) p[i].name = (char *)malloc( sizeof(char) * 30 ); p[0].name = "Kawano"; p[0].age = 34; p[0].height = 170.3; p[0].weight = 54.8; p[1].name = "Suwa"; p[1].age = 36; p[1].height = 175.3; p[1].weight = 68.1; for ( i = 0 ; i < 2 ; i++ ) { printf("\n%s\t", p[i].name ); printf("(%d)\t", p[i].age ); printf("height: %.1lf\t", p[i].height); printf("weight: %.1lf\t", p[i].weight ); } printf("\n\n"); return 0; } |
mallocを使うためにインクルードしておく. Person型の構造体を定義する.下記4つのメンバ. 名前 (メモリ確保が必要) 年齢 身長 体重 Person型の変数を2つ用意する. 名前の格納用にに30バイト分. データ変数の場合は「.」(ドット)を使ってメンバを参照する. |
 
p07.c | |
#include <stdio.h> void swap( int *suwa, int *haru ) { int value; value = *suwa; *suwa = *haru; *haru = value; } int main() { FILE *fp; char filename[100]; int a, b; sprintf( filename, "data.txt"); printf("[%s]", filename); fp = fopen( filename, "r"); if ( fp == NULL ) { fprintf( stderr, "\n\n[%s] cannot open!\n\n", filename ); return -1; } fscanf( fp, "%d\t%d", &a, &b ); fclose( fp); swap( &a, &b ); fp = fopen( filename, "w"); if ( fp == NULL ) { fprintf( stderr, "\n\n[%s] cannot open!\n\n", filename ); return -1; } fprintf( fp, "%d %d", a, b ); fclose( fp); return 0; } |
swap関数.p03.c参照のこと. ※ FILE構造体へのポインタ(ファイルポインタ). ・ファイル入出力に関する情報を管理する. fopen関数でファイルポインタを取得する.readonlyモードで. 読み込みエラーの処理も忘れずに. データを読み込む. 入出力操作の終了とともに,fclose関数で必ずファイルを閉じる. writeモードでファイルポインタを取得する. データを書き込む. flose()を忘れずに. |
 
para.h | |
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <math.h> #define Max( x, y ) ((x)>(y))?(x):(y) #define Min( x, y ) ((x)<(y))?(x):(y) typedef struct person_tag { char *name; int age; double height; double weight; struct person_tag *next; } Person; |
ヘッダファイルを取り込んでおく. 新たにstdlib.h(標準ライブラリ)と string.h(文字列操作ライブラリ), さらにはmath.h(数学ライブラリ)を追加している. 最大値と最小値を求めるマクロ. 構造体を宣言する. 名前.文字列 年齢.整数型 身長.実数型 体重.実数型 次の人のデータを指すためのポインタ Personという名の"自作の"データ型を定義する. |
p08.c | |
#include "para.h" void main( ) { Person *value; value = malloc( sizeof(Person)); printf("\nSize of *name\t%d", sizeof(value->name) ); printf("\nSize of age\t%d", sizeof(value->age) ); printf("\nSize of height\t%d", sizeof(value->height) ); printf("\nSize of weight\t%d", sizeof(value->weight) ); printf("\nSize of *next\t%d", sizeof(value->next) ); printf("\nSize of Person %d\n\n", sizeof( Person) ); } |
para.h を取り込む. Person型のポインタ変数を宣言する. とりあえず一人分のデータを用意する(メモリ領域確保) 以下,構造体のメンバーの大きさ(サイズ)を表示する. |