C++開発Appのコードインスタンス分析

5286 ワード

1.パラメータの受信方法、int main(int argc,char*argv[])
Argc--アプリケーション名を含むパラメータの数
char*argv[]:文字列を指すポインタ配列を明示し、通常、C言語で文字列を処理する際に、このような宣言と定義を行う
char *p = "Hello World" 

出力時、そのまま使用
printf("%s",p)

ではargv[0]--〉アプリケーション名;argv[1]-->入力された最初のパラメータ.Argv[2]--〉アプリケーションの2番目のパラメータ.
2.typedefとdefineの違い(ネットワーク由来)
http://www.sf.org.cn/article/base/200608/18988.html
一、typedefの使い方C/C++言語では、typedefは言語コンパイルプロセスの一部である識別子とキーワードの別名を定義するためによく使用されますが、メモリ空間は実際に割り当てられません.例:typedef int INT;typedef    int       ARRAY[10]; typedef   (int*)   pINT; typedefは、プログラムの可読性や識別子の柔軟性を向上させることができますが、「非直感性」などの欠点もあります.二、#defineの使い方#defineはマクロ定義文であり、通常は定数(パラメータなしとバンドパラメータを含む)を定義し、「表面が優しく、背後に長い列」を実現するために使用されるマクロは、コンパイル中ではなく、その前に(前処理プロセス)すでに完了している.しかし、潜在的なエラーや他のコードメンテナンスの問題を発見することは困難であり、その例は、#define INT int#define TRUE 1#define Add(a,b)((a)+(b)));define   Loop_10 for(int i=0;i<10;i++)Scott MeyerのEffective C++という本の条項1には、#define文の弊害についての分析と、良い代替方法がありますので、ご覧ください.三、typedefと#defineの違いは以上の概念からもほぼ明らかであり、typedefは可読性を高めるために識別子に付けられた新しい名称(別名のみ)にすぎず、#defineはもともとCで定数を定義するためであり、C++になるとconst、enum、inlineの出現によって徐々に別名をつけるツールとなっている.typedefとどちらを使えばいいのかよくわからない場合がありますが、#define INT intのような文はtypedefのようにできますが、どちらを使えばいいのでしょうか.私はtypedefを使うことを主張して、初期の多くのCコンパイラの中でこの文は不法で、ただ今のコンパイラはまた拡張しました.可能な限り互換性を保つために、一般的には、#defineが「読み取り可能」の定数とマクロ文を定義するタスクに従い、typedefはキーワード、冗長なタイプの別名を定義するためによく使用されます.マクロ定義は単純な文字列置換(その場拡張)にすぎず、typedefはその場拡張ではなく、新しい名前には一定のカプセル化性があり、新しい名前の識別子が変数を定義しやすい機能を有する.上の最初の大きなコードの3行目を見てください:typedef(int*)pINT;次の行:#define pINT 2 int*の効果は同じですか?実は違う!実践の中で違いを見る:pINT a,b;の効果はint*aと同じです.int *b;2つの整数ポインタ変数が定義されていることを示します.pINT 2 a,b;の効果はint*a,bと同じです.または(int*a;int b)は、整数ポインタ変数aと整数変数bが定義されていることを示します.注意:両者には行末があります.番号の違いがありますよ.
3.関数ポインタとポインタ関数(同様にネットワーク由来)
http://www.kuqin.com/language/20080614/9502.html
プログラム実行では、関数コードはプログラムのアルゴリズム命令部分であり、配列と同様に記憶空間を占有し、対応するアドレスがある.ポインタ変数を使用して配列のヘッダアドレスを指すか、ポインタ変数を使用して関数コードのヘッダアドレスを指すか、関数コードのヘッダアドレスを指すポインタ変数を関数ポインタと呼ぶことができます.
1.関数ポインタ定義
関数タイプ(*ポインタ変数名)(パラメータリスト);
「()」の優先度が「*」より高いため、ポインタ変数名の外側の括弧は欠かせません.後の「パラメータリスト」は、ポインタ変数が指す関数のパラメータリストを表します.
例:
int (*f)(int x);
double (*ptr)(double x);
関数ポインタを定義するときは、関数ポインタとその指す関数のパラメータの個数とタイプが-致であるべきであることに注意してください.
関数ポインタのタイプと関数の戻り値のタイプも一致している必要があります.
2.関数ポインタの付与
関数名は配列名と同様に関数コードのヘッダアドレスを表すので,値を割り当てるときに直接関数ポインタを関数名に指さすだけでよい.
たとえば、
int func(int x);/*関数を宣言*/
int (*f) (int x);/*関数ポインタを宣言*/
f=func;/*func関数のヘッダアドレスをポインタf*/に割り当てる
付与時に関数funcは括弧もパラメータも持たず、funcは関数のヘッダアドレスを表すため、付与後、ポインタfは関数func(x)のコードのヘッダアドレスを指す.
3.関数ポインタで関数を呼び出す
関数ポインタは、関数名および関連パラメータによって呼び出されます.
他のポインタ変数と同様に、ポインタ変数piが整数変数iを指すポインタである場合、*pはその指す変数iに等しい.pfが浮動小数点型変数fを指すポインタである場合、*pfはその指す変数fに等価である.同様に、*fは関数func(x)を指すポインタであり、*fはその指す関数funcを表す.従ってf=funcが実行される.その後、(*f)とfuncは同じ関数を表します.
関数ポインタはストレージ領域の関数を指すため、関数ポインタで対応する関数を呼び出すことができます.次に、関数ポインタで関数を呼び出す方法について説明します.次の3つのステップを実行します.
まず、関数ポインタ変数について説明します.
例えば、int(*f)(int x);
次に、関数ポインタ変数に値を割り当てます.
例えば、f=func;(func(x)は定義が必要です)
最後に、(*ポインタ変数)(パラメータテーブル)を使用します.関数を呼び出します.
例えば:(*f)(x);(xは先に値を付けなければならない)
【例】任意にn個の数を入力し、その最大数を探し出し、最大値を出力する.
main()
{
        int f();
        int i,a,b;
        int (*p)();/*関数ポインタの定義*/
        scanf("%d",&a);
        p=f;/*関数ポインタpに値を与え、関数f*/を指すようにする
        for(i=1;i<9;i++)
        {                 scanf("%d",&b);
                a=(*p)(a,b);/*ポインタpで関数f*/を呼び出す
        }
        printf("The Max Number is:%d",a)
}
f(int x,int y)
{
    int z;
    z=(x>y)?x:y;
    return(z);
}
実行結果:
343 -45 4389 4235 1 -534 988 555 789↙
The Max Number is:4389
ポインタ関数には、2つの割り当てと呼び出しがあります.
#include 
#include 
typedef int* PINNT;
#define PP int*

int funcA(int a,int b);
int funcB(int* a,int *b);
int  main(int argc, char *argv[])
{
	int (*func)(int,int);
	//func = &funcA;
    func = funcA;
	//               
	printf("%d",func(1,10));
	//printf("%d",(*func)(1,10));
	//              
	//                     
	
}

int funcA(int a,int b)
{
	return a + b;
}

int funcB(int* a,int *b)
{
	(*a) = (*a) + (*b);
	return 1;
}

【ポインタ関数】
1つの関数は、整数データの値、文字タイプの値、および実タイプの値を持ち帰るだけでなく、ポインタタイプのデータを持ち帰ってアドレスユニットを指すこともできます.
ポインタの関数を返します.一般的には、次の形式で定義されます.
タイプ識別子*関数名(パラメータテーブル)
int *f(x,y);
ここで、x,yは形式パラメータであり、fは関数名であり、呼び出し後に整数データを指すアドレスポインタを返す.f(x,y)は関数であり、その値はポインタである.
例えば:char*ch();文字型ポインタを返す関数を表します.次の例を参照してください.
【例】文字列1(str 1)を文字列2(str 2)にコピーする、文字列2を出力する.
#include "stdio.h"
main()
{
    char *ch(char *,char *);
    char str1[]="I am glad to meet you!";
    char str2[]="Welcom to study C!";
    printf("%s",ch(str1,str2));
}
char *ch(char *str1,char *str2)
{
    int i;
    char *p;
    p=str2          if(*str2==NULL) exit(-1);
    do
    {
        *str2=*str1;
        str1++;
        str2++;
    }while(*str1!=NULL);
    return(p);
}
分析によって得ることができる
関数ポインタは関数を指すポインタであり、ポインタ関数は戻り値がポインタであることを示す関数にすぎません.
関数ポインタは、関数を指すために使用できます.