第四章C ++入門プラス

この記事では、研究ノートで、間違った場所がある場合は、自分の理解を持って、私を修正してください

4.1アレイ

C ++では配列は、整数、浮動小数点、短いと同じタイプの複数の値を格納することができるデータフォーマットであります

配列の宣言は、以下の3点ことに留意すべきです。

各要素タイプに価値の1アレイ

2.アレイ名

3.配列の要素数

ここでのpythonのpythonと同じ場所が非常にカジュアルではありませんが、C ++は、追加の要素宣言と要素数の値の型が必要です

栗の場合:

short months[12];
/* 通用格式: typeName arrayName[arratSize] */

明らかにそれはトップの一般的なフォーマット

コンパイラは、配列インデックスの使用が有効でチェックしないことに注意してください、存在しない場合、コンパイラは、(牛のバッチ)を文句ないが、プログラムが実行されている要素への代入は、エラーにつながる可能性がある場合、これは有効な指標値である必要があります(その割り当てルールようにPythonのような、当然のことながら、割り当てを超えて対象に、アレイ10のデータを行い、このああを覚えヶ月[0] = 1本)を

4.1.2配列の初期化

int months[3]={1,2,3};

C ++は、のように地図上に、中括弧で囲まれた配列の初期化ステートメントを可能にします

ルール:

それは、配列の初期化を定義することができるだけ1

2.アレイ内の要素の数より少なくてもよい時間値を提供するために、配列を初期化し、当然のことながら、残りの要素値を提供しない、全てがOに初期化はもちろん、位置のみの配列の添字を提供するために、ゼロ以下速い初期化方法であって、0

int months[3]={0};

3.アレイ、角括弧([])を初期化するには、コンパイラによって計算要素の数、及び以下の例では、自動的に計算コンパイラは、4つの要素を含む配列に、配列の要素数を指定しない場合

int months[]={1,2,3,4};

あまり価値を提供する場合、その数は、アレイ内の少ない計算値となり、これは偏差になりますので、非常に悪い、これは非常に悪いであることに注意してください、あなたは4つの値だと思うが、3つを含むアレイを1つ忘れてしまったん、フォローアップを隠して

C ++ 11個の新機能

あなたは、「=」を省略することができます

int months[2]{1,2,3};

中括弧は0に初期化し、すべてを代表して、何も含まれていません。

int months[3]{};

4.2文字列

2つの文字列が通常あります

char dog[3]={"b","a","k","l"};
char dog[3]={"bakl"};

私は問題はない熱狂的な最初の、そして最初に遭遇空白文字停止し、第二に考えます

4.2.1ステッチ文字列定数

cout <<"i like" "you.\n";
cout <<"i like you. \n";
cout <<"i"
"like you.\n;

モザイク文字を増やすことができないこれらのトップ3は、フロントの背後にあるモザイク文字は文字が続きます

4.2.4入力文字列の行を読んで

cin.getline(name,10)

この関数は、文字やラインの指定された数の読み取りが読み取りを停止するために壊し、自動的に末尾にヌル文字を高め、その後、これ以上9文字以内、行全体を読み取ることではなく、改行省、空白文字を交換する時に戻って文字列を格納します改行

cin.get()

第1の類似getling()は、もはや読んでいないと改行破棄しますが、入力キューに追加し、2つのコールが、2番目の呼び出しは、文字が改行で見て)(取得するので、それを停止する場合は、あなたは、次の方法を使用することができます

cin.get(name,AirSize);
cin.get();
cin.get(name,AirSize);

また、あるでしょう

cin.get(name,AirSize).get();

空行と他の質問:

getlineの()またはget()が空白行を読み込み、次の入力がブロックされます何が起こるか、)cin.clear(によって復元することができます

ハイブリッド入力した場合、それだけで、スプライシングと呼ばれることができます

(cin >> year).get(); // or (cin >> year).get(ch);

4.3 Stringクラス

これはまた、治療ストリングの方法である、ストリングクラス配置STD名前空間は、文字列表現を表示することができる、COUTは、オブジェクトの配列で表示することができるCIN入力に初期化することができます

違いは、単純な文は、変数の文字配列で、事業者はまた、スプライスに「+」を使用することができるということです

その他の操作4.3.3文字列クラス

strcpy(charr1,charr2); // copy charr2 to charr1

strcat(charr1,charr2); // append charr2 to charr1

もちろん、文字の長さを計算することができます、

Arrayクラス:

int len1 = strlen(charr1);

文字列は、これを使用することができます使用します。

int len1 = str1.size()

4.4構造

アレイは、20 intと同じデータを格納することができるので、より多くのデータ・ストレージのためのユーザの要求を満たすための構造が存在し、キーワード構造体ショーを使用します

struct inflatable
{
    char name[20];
    float volume;
    double price
};

これは、異なるデータに格納することができる(パイソン一見ランダムアレイが記憶することができる.....)

次に、この構造体の変数を宣言することができます

inflatbale pao = 
{
    "Glorious Gloria",
    1.88,
    29.9
};

それは少しオブジェクト指向のようなものです。Pao.name出力データは、出力が「栄光のグロリア」であります

そして、それが問題()、内側とメインの外で宣言された変数と、自分の脳のサプリメントです

4.4.6 共用体

union one4all
{
    int int_val;
    long long_val;
    double double_val;
};

これは実際には、共通のボディ構造である彼らができる、ダブル、時々、時々長い、唯一のint型時には、1を格納することができ、データの種類を複数記憶2つの以上の項目がありません労働組合が匿名であるので、メモリを節約するために使用される一般的に、スペースを節約。したがって、中間識別子id_valせずに、使用したい二つの部材を扱う、プログラマがアクティブである何のために責任があります

4.6列挙

enum spectrum{red,orange,green};

割り当ての義務規定を増やすことである、割り当てが超えてはなりません

あなたが列挙型の変数を作成しない場合は、列挙型の名前を省略することができます

列挙型変数は直接出力することができますが、直接入力することはできません。以下のような:COUT >>カラー3; //違法は
直接列挙定数を割り当てることはできません。例えば:カラー1 = 1; //不正
列挙の異なる種類の間では、相互に割り当てることができません。以下のような:カラー1 =カラー3; //違法
列挙switch文の入力と出力変数は、一般的に文字や文字列を変換するために使用され、データ処理、他の種類の列挙switch文、多くの場合、プログラムの正当性を保証するために適用され、読みやすさ。
4.7ポインタと空き容量

データ内に格納されたコンピュータプログラムの三つの基本的な性質についての最初の話が追跡されなければなりません

情報が保存されている1。

2.どのくらいの値が保存されています

3.情報の保管はどのようなタイプであります

アドレスポインタの値は、そのような彼のアドレスようにホームの値は、&家として、(&)演算子を扱うことができ、保存されています

名前は、ポインタアドレス次いで、オペレータは、名前がポインタである場合、保存することができ、このアドレスの値を、間接的な値または逆参照演算子と呼ばれる名前がアドレスに格納された値で表されます。

4.7.1宣言し、ポインタを初期化します

int型* P1、P2は、このことを強調したい、*この文は、ポインタとint型の変数を表し、各ポインタ変数名は、次のものが必要

これは、単純な初期アドレスポインタを次の

int higgens = 5

int * pt =  &higgens

注意:

long * fellow;
* fellow = 2332233;

この上に2332233を配置する場所を知っているだろう、この仲間に割り当てられたアドレスが存在しません、

long fellow = 2332233;

long * fe = &fellow;

警告:従って、ポインタ逆参照演算子(*)の前に適用する必要があり、ポインタの決意が初期化され、黄金律ポインタのために使用される適切なアドレス、。

4.7.4メモリを割り当てるために、新しい使用

int * pn = new int;

メモリを見つけるために、種類に応じて必要なメモリ、およびリターンアドレスのバイト数を決定するために、new演算子

次のように一般的な形式は次のとおりです。

typeName * pointer_name = new typeName;
int nights = 1001;
int * pt = new int;
*pt = 1001;
double * pd = new double;
*pd = 10000001.0;

しかし、知っている、ヒープまたはフリーストアメモリから割り当てられた新しい割り当てられた値格納メモリ、スタック内の変数メモリ領域

4.7.5リリースメモリー削除を使用して

メモリの新しい使用を使用するには、もちろん、あなたがメモリを解放するために削除することができます

int * ps = new int;
...
delete ps;

PSメモリのリリースがあるので

しかし、メモリが得られ、すでに解放されたメモリ・ブロックと同様に、宣言した変数を解放することはできません

次のように:

int * ps = new int;
delete ps;
delete ps; // not ok now
int jugs = 5;
int * pi = &jugs;
delete pi; // not allow, memory not allocated by new

4.7.6動的配列を作成するための新しい使用

int * pt = new int [10];
delete [] pt

しかし、* PTは、配列の値の最初の要素へのポインタであります

しかし、あなたはまだ、PT [1]、PT [0]値このようなアクセスのアレイを使用することができます

新しいの使用は、ルールを遵守し削除します。

1.割り当てられたメモリを解放するには、DELETEは使用しないでください新しいものではありません

2.二度同じメモリブロックを解放するために削除し、使用しないでください

メモリを割り当てるために、新しい[]配列を使用している場合3.、あなたは解放するdelete []を使用する必要があります

4.メモリを割り当てるための新しいエンティティの場合、リリースする(括弧なし)の削除を使用

NULLポインタの場合5.アプリケーションを削除しても安全です

4.8.4動的な構造を作成するための新しい使用

インフレータブル* psの=新しいインフレータブル;
( - >)この期間を使用することはできませんが、オペレータのアドレスを知って、オペレータは、矢印を使用します

構造は、矢印演算子を使用して、ポインタであれば構造は、構成識別子名、オペレータの使用期間である場合

代替4.10の配列

それについてのアレイライト

array<typeName, n_lem> arr;

array<double, 4> a3 = {3.14, 2.72, 1.62, 1.41};

要約:

配列、構造、およびポインタが化合物の3種類があり、アレイは、C ++オブジェクトデータ内の同じタイプの複数の値を格納してもよいし、配列の各要素の割り出し添字を使用してアクセスすることができます

構造体を使用して、メンバシップ演算子を使用することができる(。)のメンバーにアクセスするには、これらの部材のメモリの構造を定義するテンプレート構造を作成する最初のステップの構造をされる使用、単一のデータ・オブジェクトに格納された値の多くの異なるタイプとすることができます、識別子のテンプレートタイプの新しい名前になります、あなたはこのタイプの構造の変数を宣言することができます

連合は、値を格納することができるが、その値は、異なるタイプのものであってもよく、それは、使用のメンバー名モードを示し

BAIポインタは変数のアドレスを格納するように設計された、我々は、ポインタ型ステートメントは、オブジェクトへのポインタは、ポインタオペレータ基準コンタクトアプリケーション、ポインタの位置の結果の値ことを、それがメモリアドレスへのポインタであることを言います

一連の文字がNULL文字列をされて終了、文字列定数文字列が暗黙的にヌル文字が含まれている引用符で囲むことができ、char型の配列であってもよいが格納されている文字列で初期化することができますこれらの関数を使用する場合、文字列、点(へチャーポインタをstrlenを文字列関数)、文字列の長さを返す別の場所から文字列をコピーするためにヌル文字、関数strpy()を除くを表し、それがなければなりませんそれはcstingヘッダーファイルstring.hを含みます

Supportedヘッダ列C ++文字列クラスは、ユーザ文字列処理方法のための良好な代替手段を提供し、オブジェクトの文字列が自動的にユーザーが文字列をコピーするために、代入演算子を使用することができ、文字列に格納されるために、その大きさを調整します

プログラムが実行されている場合、メモリ・データ・オブジェクトを可能にする新たなオペレータの要求、オペレータは得られたメモリアドレスを返し、このアドレスは、ポインタに割り当てることができるデータ・オブジェクトがシンプルである場合、プログラムは、このメモリにアクセスするためのポインタを使用します変数は、データオブジェクトが配列である場合、それは可能であり、値を得るために、参照演算子(*)と接触して使用することができるデータ・オブジェクトは構造である場合、ポインタ逆参照演算子を使用することが可能である、要素にアクセスする配列名を使用するなど、ポインタの使用( - >)、そのメンバーにアクセスするには

名前は、配列名は、配列要素の最初のアドレスとして解釈される*(AR + I)として解釈される配列AR、AR式[I]であればポインタと配列は密接に関連しているような役割、および配列名同じポインタは、今度は、アレイ表記、要素によって割り当てられた新たなアクセスポインタ名の配列を使用することができ

メモリは、データ・オブジェクトに割り当てられたときにnewとdelete演算子は、メモリがメモリプールに戻されたときに、自動的に宣言された変数は、関数内の変数であり、および静的変数は、staticキーワードで宣言された関数や変数の外にある、表示制御が可能、2つの変数がプログラムの実行をブロックするときに発生するより少ない柔軟、自動変数であり、それは、(通常は関数定義)属する終端ブロックを残して、静的変数は、C +、プログラムサイクル全体に存在します+98新しい標準テンプレートライブラリSTLテンプレートクラスvetorを提供し、それはC ++ 11は、それが代替の固定長配列で、テンプレートクラスのアレイを提供する、動的配列のための代替であります

ポインタの概要:

1.ポインタを宣言

特定の型へのポインタを宣言するには、次の形式を使用してください:

typeName * pointerName;

//ここでは一例です

double * pn;

char * pc;

//どこ、PNとpcはポインタで、ダブル*のchar *が倍増するポインタとchar型へのポインタである
2.与えるのポインタ代入

メモリ・アドレス・ポインタに代入しなければならない、それは命名のメモリアドレスを取得するために、変数名&演算子を適用することができ、新しいnew演算子は、名前のメモリアドレスを返します。

ここでいくつかの例を示します。

double * pn;

double * pa;

double * pc;

double bubble = 3.2;

pn = &bubble;

pc = new char;

pa = new double[30];
  1. ポインタデリファレンス

ポインタを取得する手段は、ポインタ値、ポインタデリファレンスおよび間接アプリケーション値演算子(間接参照前述の例のように、バブルポイントPnがポインタである場合など、次いで、従って、間接参照にする) PN値が導かれます、または3.2

次に例を示します。

cout << *pn
*pc = "s";

別の方法は、例えば、ポインタデリファレンス配列表記を使用することで、PN [0] * PNがないように、同じ非初期化参照解除適切なアドレスポインタに

図4は、ポインタの値とポインタポイントを識別する

PTはintへのポインタである場合、PTはintへのポインタではなく、int型の変数とまったく同じではありません*、そして、PTは、ポインタであります

次に例を示します。

int * pt = new int;
*pt = 5;
  1. 配列名

ほとんどの場合、Cは配列の最初の要素のアドレスとして配列名++します

次に例を示します。

int tacos[10];

例外は、配列名のsizeof演算子、次いで(バイト単位)アレイ全体の長さを返します

  1. ポインタ演算

C ++は、後者の結果は1に等しいプラス元のアドレスの値を加えた指示物体によって占有さの合計バイト数だけでなく、他の値へのポインタは、2つのポインタ間の差を得るために減算されてもよい、ポインタと整数が追加されることができ得られた整数演算は、同じ配列の(エンドポイントであってもよい越えた位置)には、2つのポインタが、この操作は、理にかなっている場合にのみ、その二つの要素の結果として生じる分離

以下は一例です

int tacos[10] = {5,2,8,4,1,2,2,4,6,8};
int * pt = tacos;      // suppose pf and tacos are the address 3000
pt = pt + 1;           // now pt is 3004 if a int is 4 bytes
int *pe = &tacos[9];   //pe is 3036 if an int is 4 bytes
pe = pe -1;            //now pe is 3032, the address of tacos[8]
int diff = pe - pt;    // diff is 7, the separation between
                       //tacos[8] and tacos[1]

おすすめ

転載: blog.csdn.net/u013693952/article/details/90726888