C言語のまとめ
25460 ワード
C言語のまとめは、他のプログラミング言語の基礎を持つ開発者に適用される.
●すべてのC言語プログラムにmain()関数を含める必要があります.コードはmain()関数から実行されます.●/*......*/注釈説明用.・printf()は、画面への出力をフォーマットするために使用される.printf()関数はstdio.hヘッダファイルで宣言されます.● stdio.hはヘッダファイル(標準入出力ヘッダファイル)and#includeは、ヘッダファイルを導入するための前処理コマンドである.コンパイラがprintf()関数に遭遇した場合、stdioが見つからない.hヘッダファイル、コンパイルエラーが発生します.● return 0; 文は、プログラムを終了することを示すために使用されます.
定数
Cでは、定数を簡単に定義する方法が2つあります.1.#defineプリプロセッサを使用します.2.constキーを使用します.
#defineプリプロセッサ
次は、#defineプリプロセッサを使用して定数を定義する形式です.
#define identifier value
eg: #define LENGTH 10
constキーワードはconst接頭辞を使用して指定したタイプの定数を宣言できます.const type variable=valueです.eg: const int LENGTH = 10;
変数#ヘンスウ#
/*変数定義*/int a,b;
/*初期化*/a=10;b = 20;
関数#カンスウ#
max()関数とmain()関数をブロックし、ソースコードをコンパイルします.最後の実行可能ファイルを実行すると、次の結果が得られます.
Max value is : 200
はいれつ
初期化double balance[]={1000.0,2.0,3.4,7.0,50.0];値double value=balance[2]
ししん
各メモリロケーションには、メモリ内のアドレスを表すハイフン(&)演算子でアクセス可能なアドレスが定義されています.定義された変数アドレスが出力される例を参照してください.
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
var 1変数のアドレス:bff 5 a 400 var 2変数のアドレス:bff 5 a 3 f 6
アスタリスクは、変数がポインタであることを指定するために使用されます.有効なポインタ宣言は次のとおりです.
ポインタの使用
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
ポインタの算術演算
ptrはアドレス1000を指す整数ポインタであり、32ビットの整数であると仮定し、ポインタに対して以下の算術演算を実行します.
ptr++
上記の演算が実行されると、ptrは、ptrが増加するたびに、次の整数位置、すなわち現在位置を4バイト後退させるため、位置1004を指す.この演算は、メモリ位置の実際の値に影響を及ぼさずに、ポインタを次のメモリ位置に移動します.ptrがアドレスが1000の文字を指す場合、上の演算は、次の文字位置が1001であるため、ポインタが位置1001を指す.ポインタを1つ増やします
変数ポインタは定数ポインタであるため、プログラムでは配列の代わりにポインタを使用するのが好きです.変数ポインタは増加しますが、配列は増加しません.次のプログラムは、配列内の各要素に順次アクセスするために変数ポインタを増やします.
int*ptrの場合ptr存在はアドレス、*ptr存在はこのアドレスの値
関数ポインタ
関数ポインタは関数を指します.
次の例は、関数ポインタ変数pを宣言し、関数maxを指します.例
コンパイル実行、出力結果は次のとおりです.
3つの数字を入力してください:1 2 3最大の数字は:3です
文字列
Cには多数の操作文字列の関数があります.
次の例では、上記の関数を使用します.
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10
こうぞうたい
次はBook構造を宣言する方法です.
構造メンバーへのアクセス
構造のメンバーにアクセスするには、メンバー・アクセス演算子(.)を使用します.メンバー・アクセス演算子は、構造変数名とアクセスする構造メンバーの間の句点です.structキーを使用して構造タイプの変数を定義できます.次の例では、構造の使用方法を示します.
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
きょうようたい
次に、3つのメンバーi、f、strを持つDataという共通体タイプを定義します.
データ型の変数には、整数、浮動小数点数、または文字列を格納できます.これは、1つの変数(同じメモリ位置)が複数のタイプのデータを格納できることを意味します.必要に応じて、内蔵またはユーザー定義のデータ型を1つの共通体内で使用できます.
コモンが消費するメモリは、コモンの最大メンバーを格納するのに十分である必要があります.たとえば、上記の例では、データは20バイトのメモリ領域を占有します.なぜなら、各メンバーで文字列が最も占有する領域が大きいからです.次の例では、上記の共通体が使用するメモリの合計サイズを示します.
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Memory size occupied by data : 20
Cでは構造体も公用体もJavaのオブジェクトに似ています
typedef vs #define
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
TRUEの値:1 FALSEの値:0
C言語にはtypedefキーワードが用意されており、タイプに新しい名前を付けることができます.次の例では、バイト数の用語BYTEを定義します.
typedef unsigned char BYTE;
このタイプ定義の後、識別子BYTEは、例えば、タイプunsigned charの略として使用され得る.
BYTE b1, b2;
プリプロセッサ
すべてのプリプロセッサコマンドは、番号(#)で始まります.読み取りを強化するには、最初の空白以外の文字でなければなりません.プリプロセッサコマンドは、最初の列から開始する必要があります.以下に、すべての重要なプリプロセッサコマンドを示します.コマンドの説明
プリプロセッサインスタンス
次の例を解析して、異なる命令を理解します.
このコマンドはCPPにすべてのMAXを教えます.ARRAY_LENGTHを20に置き換えます.#defineを使用して定数を定義し、可読性を向上させます.
これらのコマンドは、CPPがシステムライブラリからstdioを取得することを示す.h、現在のソースファイルにテキストを追加します.次の行はCPPにローカルディレクトリからmyheaderを取得するように伝えます.h、現在のソースファイルにコンテンツを追加します.
この命令はCPPに定義されたFILEをキャンセルするように伝えた.SIZEは、42と定義されている.
この命令はCPPがMESSAGEが定義されていない場合にのみMESSAGEを定義することを示す.
この命令はCPPがDEBUGを定義した場合に処理文を実行することを示す.このコマンドは、コンパイル時にgccコンパイラに-DDeBUGスイッチの量を渡すと便利です.DEBUGを定義し、コンパイル中にデバッグをいつでもオンまたはオフにできます.定義済みマクロ
ANSI Cは多くのマクロを定義している.プログラミングではこれらのマクロを使用できますが、定義済みのマクロを直接変更することはありません.
次の例を試してみましょう.
上記のコード(ファイルtest.c)がコンパイルおよび実行されると、次の結果が得られます.
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
ヘッダファイルを参照する構文
前処理命令includeを使用して、ユーザおよびシステムヘッダファイルを参照できます.次の2つの形式があります.
この形式は、システムヘッダファイルを参照するために使用されます.システムディレクトリの標準リストでfileというファイルを検索します.ソースコードをコンパイルするときは、-Iオプションでディレクトリをリストの前に配置できます.
この形式は、ユーザーヘッダファイルを参照するために使用されます.現在のファイルを含むディレクトリでfileというファイルを検索します.ソースコードをコンパイルするときは、-Iオプションでディレクトリをリストの前に配置できます.
メモリ管理
プログラムが終了すると、オペレーティングシステムはプログラムに割り当てられたすべてのメモリを自動的に解放しますが、メモリを必要としない場合は、関数free()を呼び出してメモリを解放することをお勧めします.
あるいは、関数realloc()を呼び出すことで、割り当てられたメモリブロックのサイズを増減できます.realloc()関数とfree()関数を使用して、上記の例をもう一度確認します.
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th
#include
int main() {
/* C */
printf("Hello, World!
");
return 0;
}
●すべてのC言語プログラムにmain()関数を含める必要があります.コードはmain()関数から実行されます.●/*......*/注釈説明用.・printf()は、画面への出力をフォーマットするために使用される.printf()関数はstdio.hヘッダファイルで宣言されます.● stdio.hはヘッダファイル(標準入出力ヘッダファイル)and#includeは、ヘッダファイルを導入するための前処理コマンドである.コンパイラがprintf()関数に遭遇した場合、stdioが見つからない.hヘッダファイル、コンパイルエラーが発生します.● return 0; 文は、プログラムを終了することを示すために使用されます.
定数
Cでは、定数を簡単に定義する方法が2つあります.1.#defineプリプロセッサを使用します.2.constキーを使用します.
#defineプリプロセッサ
次は、#defineプリプロセッサを使用して定数を定義する形式です.
#define identifier value
eg: #define LENGTH 10
constキーワードはconst接頭辞を使用して指定したタイプの定数を宣言できます.const type variable=valueです.eg: const int LENGTH = 10;
変数#ヘンスウ#
/*変数定義*/int a,b;
/*初期化*/a=10;b = 20;
関数#カンスウ#
#include
/* */
int max(int num1, int num2);
int main ()
{
/* */
int a = 100;
int b = 200;
int ret;
/* */
ret = max(a, b);
printf( "Max value is : %d
", ret );
return 0;
}
/* */
int max(int num1, int num2)
{
/* */
int result;
if (num1 > num2)
result = num1;
else
result = num2;
return result;
}
max()関数とmain()関数をブロックし、ソースコードをコンパイルします.最後の実行可能ファイルを実行すると、次の結果が得られます.
Max value is : 200
はいれつ
初期化double balance[]={1000.0,2.0,3.4,7.0,50.0];値double value=balance[2]
ししん
各メモリロケーションには、メモリ内のアドレスを表すハイフン(&)演算子でアクセス可能なアドレスが定義されています.定義された変数アドレスが出力される例を参照してください.
#include
int main ()
{
int var1;
char var2[10];
printf("var1 : %x
", &var1 );
printf("var2 : %x
", &var2 );
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
var 1変数のアドレス:bff 5 a 400 var 2変数のアドレス:bff 5 a 3 f 6
アスタリスクは、変数がポインタであることを指定するために使用されます.有効なポインタ宣言は次のとおりです.
int *ip; /* */
double *dp; /* double */
float *fp; /* */
char *ch /* */
ポインタの使用
#include
int main ()
{
int var = 20; /* */
int *ip; /* */
ip = &var; /* var */
printf("Address of var variable: %x
", &var );
/* */
printf("Address stored in ip variable: %x
", ip );
/* */
printf("Value of *ip variable: %d
", *ip );
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Address of var variable: bffd8b3c Address stored in ip variable: bffd8b3c Value of *ip variable: 20
ポインタの算術演算
ptrはアドレス1000を指す整数ポインタであり、32ビットの整数であると仮定し、ポインタに対して以下の算術演算を実行します.
ptr++
上記の演算が実行されると、ptrは、ptrが増加するたびに、次の整数位置、すなわち現在位置を4バイト後退させるため、位置1004を指す.この演算は、メモリ位置の実際の値に影響を及ぼさずに、ポインタを次のメモリ位置に移動します.ptrがアドレスが1000の文字を指す場合、上の演算は、次の文字位置が1001であるため、ポインタが位置1001を指す.ポインタを1つ増やします
変数ポインタは定数ポインタであるため、プログラムでは配列の代わりにポインタを使用するのが好きです.変数ポインタは増加しますが、配列は増加しません.次のプログラムは、配列内の各要素に順次アクセスするために変数ポインタを増やします.
#include
const int MAX = 3;
int main ()
{
int var[] = {10, 100, 200};
int i, *ptr;
/* */
ptr = var;
for ( i = 0; i < MAX; i++)
{
printf(" :var[%d] = %x
", i, ptr );
printf(" :var[%d] = %d
", i, *ptr );
/* */
ptr++;
}
return 0;
}
// , :
// :var[0] = bf882b30
// :var[0] = 10
// :of var[1] = bf882b34
// : var[1] = 100
// :of var[2] = bf882b38
// :var[2] = 200
int*ptrの場合ptr存在はアドレス、*ptr存在はこのアドレスの値
関数ポインタ
関数ポインタは関数を指します.
次の例は、関数ポインタ変数pを宣言し、関数maxを指します.例
#include
int max(int x, int y)
{
return x > y ? x : y;
}
int main(void)
{
/* p */
int (* p)(int, int) = & max; // &
int a, b, c, d;
printf(" :");
scanf("%d %d %d", & a, & b, & c);
/* ,d = max(max(a, b), c) */
d = p(p(a, b), c);
printf(" : %d
", d);
return 0;
}
コンパイル実行、出力結果は次のとおりです.
3つの数字を入力してください:1 2 3最大の数字は:3です
文字列
Cには多数の操作文字列の関数があります.
1 strcpy(s1, s2);
s2 s1。
2 strcat(s1, s2);
s2 s1 。
3 strlen(s1);
s1 。
4 strcmp(s1, s2);
s1 s2 , 0; s1s2 0。
5 strchr(s1, ch);
, s1 ch 。
6 strstr(s1, s2);
, s1 s2 。
次の例では、上記の関数を使用します.
#include
#include
int main ()
{
char str1[12] = "Hello";
char str2[12] = "World";
char str3[12];
int len ;
/* str1 str3 */
strcpy(str3, str1);
printf("strcpy( str3, str1) : %s
", str3 );
/* str1 str2 */
strcat( str1, str2);
printf("strcat( str1, str2): %s
", str1 );
/* ,str1 */
len = strlen(str1);
printf("strlen(str1) : %d
", len );
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
strcpy( str3, str1) : Hello strcat( str1, str2): HelloWorld strlen(str1) : 10
こうぞうたい
次はBook構造を宣言する方法です.
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
} book;
構造メンバーへのアクセス
構造のメンバーにアクセスするには、メンバー・アクセス演算子(.)を使用します.メンバー・アクセス演算子は、構造変数名とアクセスする構造メンバーの間の句点です.structキーを使用して構造タイプの変数を定義できます.次の例では、構造の使用方法を示します.
#include
#include
struct Books
{
char title[50];
char author[50];
char subject[100];
int book_id;
};
int main( )
{
struct Books Book1; /* Book1, Book */
struct Books Book2; /* Book2, Book */
/* Book1 */
strcpy( Book1.title, "C Programming");
strcpy( Book1.author, "Nuha Ali");
strcpy( Book1.subject, "C Programming Tutorial");
Book1.book_id = 6495407;
/* Book2 */
strcpy( Book2.title, "Telecom Billing");
strcpy( Book2.author, "Zara Ali");
strcpy( Book2.subject, "Telecom Billing Tutorial");
Book2.book_id = 6495700;
/* Book1 */
printf( "Book 1 title : %s
", Book1.title);
printf( "Book 1 author : %s
", Book1.author);
printf( "Book 1 subject : %s
", Book1.subject);
printf( "Book 1 book_id : %d
", Book1.book_id);
/* Book2 */
printf( "Book 2 title : %s
", Book2.title);
printf( "Book 2 author : %s
", Book2.author);
printf( "Book 2 subject : %s
", Book2.subject);
printf( "Book 2 book_id : %d
", Book2.book_id);
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Book 1 title : C Programming Book 1 author : Nuha Ali Book 1 subject : C Programming Tutorial Book 1 book_id : 6495407 Book 2 title : Telecom Billing Book 2 author : Zara Ali Book 2 subject : Telecom Billing Tutorial Book 2 book_id : 6495700
きょうようたい
次に、3つのメンバーi、f、strを持つDataという共通体タイプを定義します.
union Data
{
int i;
float f;
char str[20];
} data;
データ型の変数には、整数、浮動小数点数、または文字列を格納できます.これは、1つの変数(同じメモリ位置)が複数のタイプのデータを格納できることを意味します.必要に応じて、内蔵またはユーザー定義のデータ型を1つの共通体内で使用できます.
コモンが消費するメモリは、コモンの最大メンバーを格納するのに十分である必要があります.たとえば、上記の例では、データは20バイトのメモリ領域を占有します.なぜなら、各メンバーで文字列が最も占有する領域が大きいからです.次の例では、上記の共通体が使用するメモリの合計サイズを示します.
#include
#include
union Data
{
int i;
float f;
char str[20];
};
int main( )
{
union Data data;
printf( "Memory size occupied by data : %d
", sizeof(data));
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Memory size occupied by data : 20
Cでは構造体も公用体もJavaのオブジェクトに似ています
typedef vs #define
#define C , , typedef , :
typedef ,#define , , 1 ONE。
typedef ,#define 。
#include
#define TRUE 1
#define FALSE 0
int main( )
{
printf( "TRUE : %d
", TRUE);
printf( "FALSE : %d
", FALSE);
return 0;
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
TRUEの値:1 FALSEの値:0
C言語にはtypedefキーワードが用意されており、タイプに新しい名前を付けることができます.次の例では、バイト数の用語BYTEを定義します.
typedef unsigned char BYTE;
このタイプ定義の後、識別子BYTEは、例えば、タイプunsigned charの略として使用され得る.
BYTE b1, b2;
プリプロセッサ
すべてのプリプロセッサコマンドは、番号(#)で始まります.読み取りを強化するには、最初の空白以外の文字でなければなりません.プリプロセッサコマンドは、最初の列から開始する必要があります.以下に、すべての重要なプリプロセッサコマンドを示します.コマンドの説明
#define
#include
#undef
#ifdef ,
#ifndef ,
#if ,
#else #if
#elif #if , ,
#endif #if……#else
#error ,
#pragma ,
プリプロセッサインスタンス
次の例を解析して、異なる命令を理解します.
#define MAX_ARRAY_LENGTH 20
このコマンドはCPPにすべてのMAXを教えます.ARRAY_LENGTHを20に置き換えます.#defineを使用して定数を定義し、可読性を向上させます.
#include
#include "myheader.h"
これらのコマンドは、CPPがシステムライブラリからstdioを取得することを示す.h、現在のソースファイルにテキストを追加します.次の行はCPPにローカルディレクトリからmyheaderを取得するように伝えます.h、現在のソースファイルにコンテンツを追加します.
#undef FILE_SIZE
#define FILE_SIZE 42
この命令はCPPに定義されたFILEをキャンセルするように伝えた.SIZEは、42と定義されている.
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif
この命令はCPPがMESSAGEが定義されていない場合にのみMESSAGEを定義することを示す.
#ifdef DEBUG
/* Your debugging statements here */
#endif
この命令はCPPがDEBUGを定義した場合に処理文を実行することを示す.このコマンドは、コンパイル時にgccコンパイラに-DDeBUGスイッチの量を渡すと便利です.DEBUGを定義し、コンパイル中にデバッグをいつでもオンまたはオフにできます.定義済みマクロ
ANSI Cは多くのマクロを定義している.プログラミングではこれらのマクロを使用できますが、定義済みのマクロを直接変更することはありません.
__DATE__ , "MMM DD YYYY" 。
__TIME__ , "HH:MM:SS" 。
__FILE__ , 。
__LINE__ , 。
__STDC__ ANSI , 1。
次の例を試してみましょう.
#include
main()
{
printf("File :%s
", __FILE__ );
printf("Date :%s
", __DATE__ );
printf("Time :%s
", __TIME__ );
printf("Line :%d
", __LINE__ );
printf("ANSI :%d
", __STDC__ );
}
上記のコード(ファイルtest.c)がコンパイルおよび実行されると、次の結果が得られます.
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
ヘッダファイルを参照する構文
前処理命令includeを使用して、ユーザおよびシステムヘッダファイルを参照できます.次の2つの形式があります.
#include
この形式は、システムヘッダファイルを参照するために使用されます.システムディレクトリの標準リストでfileというファイルを検索します.ソースコードをコンパイルするときは、-Iオプションでディレクトリをリストの前に配置できます.
#include "file"
この形式は、ユーザーヘッダファイルを参照するために使用されます.現在のファイルを含むディレクトリでfileというファイルを検索します.ソースコードをコンパイルするときは、-Iオプションでディレクトリをリストの前に配置できます.
メモリ管理
1 void *calloc(int num, int size);
num , size 。
2 void free(void *address);
address h 。
3 void *malloc(int num);
num , 。
4 void *realloc(void *address, int newsize);
, newsize。
プログラムが終了すると、オペレーティングシステムはプログラムに割り当てられたすべてのメモリを自動的に解放しますが、メモリを必要としない場合は、関数free()を呼び出してメモリを解放することをお勧めします.
あるいは、関数realloc()を呼び出すことで、割り当てられたメモリブロックのサイズを増減できます.realloc()関数とfree()関数を使用して、上記の例をもう一度確認します.
#include
#include
#include
int main()
{
char name[100];
char *description;
strcpy(name, "Zara Ali");
/* */
description = malloc( 30 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory
");
}
else
{
strcpy( description, "Zara ali a DPS student.");
}
/* */
description = realloc( description, 100 * sizeof(char) );
if( description == NULL )
{
fprintf(stderr, "Error - unable to allocate required memory
");
}
else
{
strcat( description, "She is in class 10th");
}
printf("Name = %s
", name );
printf("Description: %s
", description );
/* free() */
free(description);
}
上記のコードがコンパイルおよび実行されると、次の結果が得られます.
Name = Zara Ali Description: Zara ali a DPS student.She is in class 10th