個人財務 C ++での配列とポインタ - ダミー

C ++での配列とポインタ - ダミー

ビデオ: 1.5倍速でのC、C++入門 その6~多次元配列、ポインタ~ 2025

ビデオ: 1.5倍速でのC、C++入門 その6~多次元配列、ポインタ~ 2025
Anonim

配列の名前は配列自体へのポインタです。 配列 は、メモリに格納された一連の変数です。 配列名 は、最初の項目を指します。

これはポインターに関する興味深い質問です:次のような関数ヘッダーがあり、sizeofを使用して配列内の要素の数を判断できますか?そうであれば、この関数は呼び出し元に配列のサイズを指定させる必要はありません。

<!
void ProcessArray(int Numbers []){099}この関数は、Array01サンプルとそれを呼び出すmain()で見つかったとみなします。 (int argc、char * argv []){int MyNumbers [] = {1、2、3、4、 5,6,7,8,9,10}。 cout << "outside function:バイト単位のサイズです。 cout << sizeof(MyNumbers)<< endl; ProcessArray(MyNumbers); return 0;}

このアプリケーションを実行すると、次のように表示されます。

<!外部関数:バイト単位のサイズは40です。内部関数:バイト単位のサイズは4です。

関数外では、コードは配列のサイズが40バイトであることを認識します。しかし、配列内にあると、コードはサイズが4であると考えているのはなぜですか?理由は、配列を渡しているように見えても、本当に

ポインタ
を配列に渡しているからです。ポインタのサイズはちょうど4であり、最終的なcout行が出力するものです。

<!配列を宣言することには若干の特異性があります。 int MyNumbers [5]のような一定数の要素を指定して配列を宣言すると、 コンパイラは配列を持っていることを知り、sizeof演算子は配列全体のサイズを返します。配列名は、

ポインタと配列の両方です。しかし、

void ProcessArray(int Numbers []){

などの配列サイズを持たない関数ヘッダを宣言すると、コンパイラはこれを単純に

ポインタ とみなします。 void ProcessArray(int * Numbers){

したがって、どちらかの行が宣言している関数の中で、次の2行のコードは

と同等です。 この行は、 : Numbers [3] = 10; *(Numbers + 3)= 10;

これは、

extern int MyNumbers [];のような配列に対してextern宣言を使用すると、 この配列のサイズをとると、コンパイラは混乱します。ここに例があります:2つのファイルがある場合、数字。 cppとmain。 cpp、ここで数字。 cppは配列とmainを宣言します。 cppがそれを外部的に宣言すると(Array02の例のように)、sizeofを呼び出すとコンパイラエラーが発生します: #include using namespace std; extern int MyNumbers []; int main(int argc、char * argv []){cout << sizeof(MyNumbers)<< endl;

gccコンパイラがエラーを返します:

エラー: 'sizeof'が不完全な型int [] 'に無効です。

解決策はサイズを指定することです括弧内の配列のサイズが他のソースコードファイルと同じであることを確認してください!番号を変更してコンパイラを偽造すると、

はエラーになりません。

しかし、それは悪いプログラミングスタイルであり、エラーを求めているだけです。

配列

は単純にメモリ内で互いに隣接する変数のシーケンスですが、配列の

名前 は実際には配列内の最初の要素へのポインタにすぎません。名前はポインタとして使用できます。ただし、実際にポインタを使用する必要がある場合にのみ実行してください。結局のところ、あなたは本当に*(Numbers + 3)= 10のような暗黙のコードを書く必要はありません。 。 その逆も真です。この関数を見てください:

void ProcessArray(int * Numbers){cout << numbers [1] << endl;}この関数はパラメータとしてポインタをとりますが、配列としてアクセスします。繰り返しますが、このようなコードを記述しないでください。代わりに、 なぜこのようなコード が理解できるのかを理解する必要があります。こうすることで、配列の深い知識とそれらがコンピュータ内部でどのように暮らしているかを知ることができ、この知識が順番に正しく動作するコードを書くのに役立ちます。 配列名は単なるポインタであるにもかかわらず、整数配列の名前は整数へのポインタとまったく同じではありません。次のコード行を確認してください(Array03の例を参照してください): int LotsONumbers [50]; int x; LotsONumbers =&x;

LotsONumbers

のポインタ

を別のもの、つまり整数として宣言します。コンパイラはこれをやらせません。エラーが発生します。 LotsONumbersがint * LotsONumbersとして宣言されている場合はそうではありません。このコードは動作します。しかし、書かれているように、このコードはコンパイラエラーを引き起こします。それは信じられないかもしれませんが、コード::ブロック: エラー: 'int *'を 'int [50]'に代入する際の互換性のない型です。このエラーはコンパイラがint *とint []の2つの型の明確な区別。それにもかかわらず、配列名は実際にポインタであり、あなたはそれを1つとして使うことができます。それを再割り当てするなど、通常のポインタでできることすべてを行うことはできません。 配列を使用する場合、以下のヒントに注意してください。これらは、配列をバグフリーに保つのに役立ちます:

コードの一貫性を保つ。たとえば、整数へのポインタを宣言する場合は、配列として扱わないでください。

コードをはっきりと理解してください。ポインタを渡すと、&(MyNumbers [0])のように最初の要素のアドレスを取ってコードを明確にすることができます。ただし、これはMyNumbersだけに相当します。

配列を宣言するときは、配列をとる関数を記述していない限り、常に角括弧の中に数字を入れてみてください。 externキーワードを使用して配列を宣言する場合は、配列のサイズを角かっこで囲みます。しかし、一貫してください! 1つの番号と別の番号を別の番号で使用しないでください。一貫性を持たせる最も簡単な方法は、const intのような定数を使うことです。ArraySize = 10;共通のヘッダーファイルに格納し、配列宣言で使用します。int MyArray [ArraySize]; 。

C ++での配列とポインタ - ダミー

エディタの選択

IOSアプリケーション開発の既存クラスにメソッドを追加する方法 - ダミー

IOSアプリケーション開発の既存クラスにメソッドを追加する方法 - ダミー

Objective-Cでは、作成していないクラスであっても、iOSアプリケーションの既存のクラスに独自のメソッドを追加できます。クラスにメソッドを追加することは、特定の状況でのみ新しい動作が使用される場合に便利です。たとえば、特定のアプリケーション...

IOSアプリケーション開発の既存クラスにメソッドを追加する方法 - ダミー

IOSアプリケーション開発の既存クラスにメソッドを追加する方法 - ダミー

IOSアプリケーションの開発では、Objective-Cを使用すると、自分が作成していないクラスであっても、既存のクラスに独自のメソッドを追加することができます。クラスにメソッドを追加することは、特定の状況でのみ新しい動作が使用される場合に便利です。たとえば、特定のアプリケーション(たとえば、...

In App Purchase機能がiPadアプリで動作する仕組み

In App Purchase機能がiPadアプリで動作する仕組み

Apple App App Purchase機能を提供します。これにより、アプリユーザーはアプリ内から仮想アイテムを直接購入することができます。複数のレベルや環境、または仮想プロパティを持つゲームアプリケーションを開発する場合は、アプリケーションにIn App Purchase機能を追加して、レベル、環境、またはプロパティをさらに販売することを検討してください。 App Purchaseで...

エディタの選択

効果的なホームビジネスWebサイトを作成する方法 - ダミー

効果的なホームビジネスWebサイトを作成する方法 - ダミー

素晴らしいかもしれませんが、製品やサービスをさらに販売するのに役立たない場合は、時間とお金の無駄です。自宅のビジネスにとって本物の資産であるWebサイトを構築するための、実証済みの方法をいくつか試してみましょう。難しいことではありません...

マスターCSSファイルを作成する方法 - ダミー

マスターCSSファイルを作成する方法 - ダミー

多くのデザイナーがマスターHTMLコードのCSSファイルを作成し、個々のサイトのニーズに合わせて、最初からウェブサイトを構築するプロセスをスピードアップします。あなたがより多くのウェブサイトを構築するにつれて、いくつかのスタイルは標準的なデザインプラクティスの標準的な部分になります。 ...

MSN adCenterのウェブマーケティングキャンペーンのアカウントを作成する方法 - ダミー

MSN adCenterのウェブマーケティングキャンペーンのアカウントを作成する方法 - ダミー

Bing検索結果と並んでクリック単価(PPC)広告はMSN adCenterを通じて提供されます。 adCenterを使用して、Webマーケティングのニーズに合わせてアカウントとキャンペーンを作成できます。 Microsoftは、Bing Travel、adCenter Desktopなどのプログラムを追加することで、PPCサービスのインターフェース、ツール、検索品質、およびボリュームを向上させるために歩み続けています。...

エディタの選択

地中海ダイエットレシピ:フルーツサラダ - ダミー

地中海ダイエットレシピ:フルーツサラダ - ダミー

果実は地中海で豊富に生育し、地中海沿岸に沿って、アメリカ人より一般的に果実を多く食べるため、地中海の高レベルの疾病予防に貢献しています。あなたの次の食事やパーティーのために健康的なサイドディッシュのフルーツサラダを作るには、いくつかの方法があります。果物は地中海で豊富に生育し、地中海沿岸に住む人々は一般にアメリカ人よりも多くの果実を食べるため、地中海の高レベルの疾病予防に寄与します。

地中海料理ダイスレシピ:クラシックジャイロとピタ - ダミー

地中海料理ダイスレシピ:クラシックジャイロとピタ - ダミー

ジャイロとピタサンドイッチは一般的なカジュアルな食品です地中海でピザや他の地中海のサンドイッチと同じように、今日はピタサンドイッチとジャイロのさまざまなバージョンが存在します。ピタスは蒸気で作られた中央のポーチ付きの丸いパンです。