Cプログラミング言語(IX)

第九章ポインタ

各メモリセルは、変数は、特定の記憶装置のコンピュータメモリに格納されている固有アドレスCのプログラムを有しています

することで、アドレス演算子&変数のアドレスを取得することが可能

 

// L9-1

する#include <stdio.hの> 
int型のmain()
{ 
    int型、A = 0、B = 1 
    チャーC = 'A' 
    printf( "Aは%であり、およびAは%Pを\ nである"、&A )。 printf( "Bは%であり、およびBは、%Pを\ nである"、B&B)。 printf( "Cは、%Cであり、およびCは、%Pを\ nである"、C&C)0を返します}

 

//実行結果
Aが0、A&IS 0060FF0C 
Bがあります。1、Bは、IS&0060FF08 
Cは、C IS&0060FF07 IS

 

 

のC出力変数のアドレス値を示す%のP指定子、B、

アドレス値は、語長である進符号なし整数で、一般的にホストのワード長と同じです

 

  • 住所変数:メモリ内の変数によって占められるストレージスペースの最初のアドレス
  • 変数の値:収納スペースに格納された変数データ
  • 変数名:データ・ストレージ・スペースプログラムの抽象

 

ポインター:変数のアドレスを格納する変数の特殊なタイプ

 

キーワード*ポインタ変数名を入力します。

 

 

すなわち、ポインタ変数が指す変数のデータ・タイプを表すキーワードを入力ポインタ変数の基本型を

 

定義されたポインタ変数はポインタ変数名のデータ型を宣言され、に指し示すことができ、ポインタ変数が指すかどこに指定されていませんでした

 

// L9-2

する#include <stdio.hの> 
int型のmain()
{ 
    int型A = 0、B = 1の。; 
    チャーC = 'A' ; 
    int型*のPA、PBが*; / *ポインタ変数を定義* PA及びPB / 
    チャー*のPC; / *ポインタ変数PC / *の定義 PA =&A; / * / *を指すようにポインタ変数PAを初期化 =&B PB; / * B * /指し示すようにポインタ変数PBを初期化するので、/ *ポインタを初期化し、変数PC、PCを=&CこれC * /を指す( "Aは、%Dであり、&​​Aは%Pであり、PAは%Pであり、&​​PAは%Pの\のN- IS"、A&A、PA、およびprintfのPA);のprintf(「Bは、%Dであり、&​​B Pbは%Pであり、およびPbは%Pの\のN- IS "B&B、鉛、&​​%pは、鉛);のprintf(" Cは、%Cであり、およびCは、%Pであり、PCは%Pであり、&​​PCは、%Pは\ N-」、C&C、PC、およびPC);戻り0 ;}

 

//运行结果
aは0であり、およびAはPAが0060FF0Cで、0060FF0Cあり、&​​PAは0060FF00 
bが1であり、およびBは、PBは0060FF08ある0060FF08で、&​​PBは0060FEFCの
Cは、&​​Cは0060FF07で、PCは0060FF07あり、&​​pcは0060FEF8あります

 

 

それがポイントする場所ポインタ変数初期化されていないポインタ変数手段の値はランダム値であり、予測することはできません

それが慣習がNULLに初期化されると同時に、ポインタ変数の定義では、潜在的に危険なシステムを初期化するために、ポインタを忘れないようにするに

int型* PA = NULL;

インジケータ変数の定義では、ポインタ変数間、初期化することができます

如int型* PA =&; 

 

間接演算子:

  • アドレス変数または変数によって可変のダイレクトアクセスモードの内容にアクセスするには:直接アドレッシング
  • 間接アドレッシング:間接的に根本的な変数にアクセスするためのポインタ変数のアクセス方法を

 

ポインタ変数への値の間接演算子アクセス*変数指摘

 

// L9-3

する#include <stdio.hの> 
int型のmain()
{ 
    int型A = 0、B = 1の。; 
    チャーC = 'A' ; 
    INT *&PA = A * = Pbを&B; / *ポインタ変数が定義されているPA、PB及びPC初期化* /ながら
    するchar * PC =&C;ポインタ変数定義する// *ポインタ型指定子
    (「Aは%dと、printf関数を &Aは%Pであり、PAは%Pであり、* PAは%dと\ N-「A&、PA、* PA);  変数に対応する変数メモリアドレスに格納されたポインタの値を読み出して表示するための// *間接参照演算子として、 のprintf(」bは%dです、 &Bは、Pは、Pbが%Pであり、* Pbは%D \ N- "B&B、鉛、*は%であり、Pb)の Cは、%Cであり、およびCは、%Pであり、PCは%Pであり、* PCはISのprintfは(" Cの%の\ N-」、C、&C、PC、* PC);の戻り0 ;}

 

//运行结果
aは0であり、およびAは* PAが0であり、PAは0060FF00で、0060FF00で
bは1であり、およびBは0060FEFCあり、PBが0060FEFCである、* PBが1であり
、Cは、&​​Cは0060FEFBで、PCは0060FEFB、* PCでありますあります

 

 

* PA出力値とは、このように、それは修正さの値に相当する*のPAの値を変更する、相当する値を出力します。

ポインタ間接参照:変数の点でポインタ変数の基準値

 

本当のポインタは、その内容にアクセスするには、意味のあるメモリの一部を指した後にのみ

 

使用ポインタを遵守する必要があります。

  1. 常に明確な場所各ポインタが指します
  2. 常にオブジェクトへの各ポインタの内容が明確であるもの
  3. 初期化されていないポインタ変数を使用しないでください

 

値による呼び出し

// L9-4

する#include <stdio.hの> 
ボイド楽しい(int型PAR); 
int型のmain()
{ 
    int型= Argの1。; 
    のprintf( "のArg D =%\ N-" アルギニン);  ファン(アルギニン);渡さ/ *引数の値関数へのコピー* /  のprintf( "のArg =%D \ N-" アルギニン); 0を返す;}ボイドファン(INT PAR)を{のprintf( "PAR =%D \ N-" 、PAR); PAR = 2; / *パラメータ値を変更します* / }

 

//動作結果
のArg = 1つの
PAR = 1 
のArg = 1

 

 

関数の引数値のパラメータ値を変更すると、変更に影響を与えませんでした

それはの関数パラメータに渡された実数値関数呼び出し文の唯一の基準値であるためですコピー

したがって、メソッド呼び出しによって呼び出される関数値の呼び出し文の引数の値を変更することはできません。

 

参照することによってシミュレートされたコール

// L9-5

する#include <stdio.hの> 
ボイド楽しい(INT * PAR); 
int型のmain()
{ 
    int型=引数1。; 
    のprintf( "%のD =引数\ N-" 引数);  ファン(&引数);引数の/ *可変トランスミッション関数へのアドレス値* /  のprintf( "のArg =%D \ N-" アルギニン); 0を返す;}ボイド楽しい(INT * PAR){のprintf( "PAR =%D \ N-"、* PAR); / *出力可変ポイントのパラメータ値は、* / * PAR = 2; / * 変数パラメータ点の値を変更します* / }

 

//実行結果の
Argを。1 = 
PAR。1 = 
Argを= 2

 

 

関数パラメータの宣言は、関数ポインタ変数パラメータとして、ポインタ型であります

受信したパラメータデータはアドレス値であります

引数ポイントの変更されたパラメータ値を使って楽しい機能()*間接演算子

 

参照によるシミュレーションコールが変更されたデータ値を返す一般的な機能であります

 

// L9-6

する#include <stdio.hの> 
ボイドスワップ(X INT *、INT * Y); 
int型のmain()
{ 
    int型  A、B; 
    のprintf( "A、Bを入力してください" );  scanfの( "%のDは、%D" 、&​​、&B);  のprintf( "スワップ前:=%のD、B =%D \ N-"、B)、交換A、B * /印刷前/ * スワップ(&、&B); / *関数呼び出しアドレススワップ()* /によれば/ * B、検証* /リターン0を交換するか否か;のprintf( "%A = D、B = D%\ N-スワップ後"、B);} / *機能:整数* /ボイドスワップのスワップ値(X INT *、INT * Y){int型のTEMP; * X = TEMP;ステップ/ *実行7-5(B)①*の/ * X = Y *; / * 7-5のステップを実行する②(B)中の* / * Y =温度; / *は、手順7-5(B)を実行③* / }

 

//运行结果
入力してください、B:15,8 
スワップ前:A = 15、B = 8 
の後にスワップする:a = 8、B = 15

 

 

パラメータの関数としてポインタ変数

// L9-7

する#include <stdio.hの> 
に#define N 30 
空隙FindMax(スコアはint []、ロングNUM []、N-INT、INT * pMaxScore、ロング* pMaxNum); 
int型のmain()
{ 
    int型の  スコア[N]、MaxScore; 
    INT  N-、I;  ロング NUM [N]、MAXNUM;  のprintf( "どのように多くの学生。?" ); scanfの( "%のD"、&N-); / *入力キーボードのn * /学生数からのprintf(「入力学生APOSのIDとスコア:\ N-」)のための(I = 0、I <N - 、I ++ ){scanfの( "%のLD%dの"、および[I] NUM、&スコア[I]); / *文字の前にDの文字のL * / } FindMax(スコア、NUM、N、 &maxScore、&MAXNUM); / * アドレスに関数を呼び出す* / のprintf( "%D = MaxScore、MAXNUM LD =%\ N-" 、MaxScore、MAXNUM);戻り0;} / *機能:最高点と学校の学生の対応する数* /ボイドFindMax(スコアINT []、ロングNUM []、N-INT、INT * pMaxScore、ロング*計算pMaxNum){int型私は、* = pMaxScoreを/ * [0]現在の最高スコアがある* / * pMaxNum = NUM [スコア0と仮定; [0]スコア / *;] レコードスコア[0]学生番号num [0] * /用( i = 1; iは< N; iは全てのスコア[I]のため* / ++)を比較する* / {IF(スコア[I]> * pMaxScore)/ *もしスコア[i]が現在の最高スコア* /より高い{* pMaxScore =スコア[I]。 / *現在の最高得点を変更する* / * pMaxNum = NUM [I ] スコアと[I]; / *現在の最高得点の学生の学習回数NUMを記録し、[I] * / }}}

 

//运行结果
どのように多くの学生5?
入力学生のIDとスコア:
120310122 84 
120310123 83 
120310124 88 
120310125 87 
120310126 61 
maxScore = 88、MAXNUM = 120310124

 

 

値関数呼び出しの前に決定されなければならない最初の三つのパラメータ、したがってパラメータエントリと呼ばれる関数のFindMax関数()

そして、そのポインタパラメータ引数関数アウトレットと呼ばれる関数呼び出しの完了後に決定されるポインタ変数の値が、

 

関数ポインタ:関数へのポインタ

変数に格納された関数へのポインタは、メモリ内の機能・エントリ・アドレスであります

関数名は、メモリ開始アドレスでソースコードの関数であり、

コンパイラは、()と名前が機能しない関数のエントリ・アドレスとして解釈され

 

// L9-8

する#include <stdio.hの> 
に#define N 40 
INT ReadScore(スコアはint []); / *関数プロトタイプ性能入力* / 
ボイドPrintScore(スコアはint []、INT N-); / *出力スコア関数のプロトタイプ* / 
ボイドAscendingSort ([]、int型N INT ); / * ソート昇順関数プロトタイプ* / 
ボイドDescendingSort([]、int型N INT ); / * ソート降順関数プロトタイプ* / 
ボイドスワップ(INT * X、INT * Y)。 / *二つのスイッチング関数プロトタイプの数* / 
int型のmain()
{ 
    int型N- [N]をスコア; 
    注文をint型、1 / *値は昇順を示し、降順のソートは2 * /で表される
    N-ReadScore =(音楽); / *、結果を入力し、学生* /の数を返す (「総学生は、%D \ N-ある」printf関数を、N-)を;  のprintf(「N- \、昇順にソートに1を入力してください」);のprintf(「降順でソートに2を入力します。 : "int型N){int型のI。私は++; iがn <(I = 0){のprintf( "%4D"は、[I])をスコア;}のprintf( "\ N-" );} / *機能:[INT配列a * /ボイドAscendingSortの選択方法を達成する昇順( ]、INT nを)/ *昇順関数定義の* / {int型I、J、K、のための(I = 0、I <N - 1; I ++ ){K = Iであり;(Jため= I + 1、。J <N-; J ++ ) {IF([J] <[K])K = J;} IF(K = I!)スワップ(&[K]、および[I]);}} / *機能:選択方法実施配列A注文する* / void DescendingSort([int型降順にソート ]、INT n)を/ * * /降順のソート関数定義{int型のための(I = 0;私は<N-- 1; I ++はI、J、K ){K = Iを;のため(J = I + 1、。J <N-; J ++ ){IF([J]> A [K])K = J;}(!K = I)IFスワップ(&A [K]、&A [I ]);}} / *関数の2つの交換可能な整数* /ボイドスワップ(X INT *、INT * Y){int型のTEMP; * TEMP = X; * = X * Y、Y * = TEMP;}

 

//运行结果
入力スコア:90 
入力点数:91 
入力点数:92 
入力点数:86  入力点数:97  入力スコア:-1 総学生が5さでソートするには、1を入力して降順でソートするには、2を入力し、昇順:2 データ項目元の順序90の91 92 86 97 データ項目に97 92 91 90 86降順

 

 

// L9-9

する#include <stdio.hの> 
に#define N 40 
INT ReadScore(INT スコア[]); 
無効PrintScore(スコアはint []、INT N-);                      
ボイド選択ソート(A INT []、N-INT、INT(*比較)(INT 、int型B)); 
INT昇順(INT A、INTのB)は、 降順(int型A、INT int型、B) ボイドスワップ(INT * X、INT * INT; Y) メイン(){int型、スコア[N]をN; int型の順序は; / * 1の値は、昇順を示し、降順のソートが表される2 * / N-ReadScore =(スコア); / *スコア入力は、学生の数* /戻りのprintf( "%のDである総学生\ N-" 、N-); "と入力ソート昇順に1、\ N-で"のprintf("に入力ソート降順に2:"のprintf(;)); scanfの( "%のD"、&注文); "データ項目オリジナル注文の\ N-中"のprintf(); PrintScore(スコア、N-); / *出力* / IF(注文は== 1の結果をソートする前に。){選択ソート(スコア、N-、昇順); / ()* /昇順に*関数ポインタのprintf( "昇順\のN-におけるデータ項目を" );}他{選択ソート(スコア、N-、降順);降順(へ/ *関数ポインタ)* / のprintf(「データ項目に降順\ N-」);} PrintScore(スコア、N-); / *スコアがソート出力* /リターン0 ;} / *機能:負の入力は、入力が終了し、パフォーマンスのコース、入力の学生、学生の数* / int型ReadScore(INT返しスコア[]){int型I = -1 ; DO {I ++は:( "入力スコア"のprintfを、( "%のD"、&scanfのを;)[I]スコア);(}しばらくスコア[I]> = 0 );を返すIを;} / *機能:出力生徒の成績する* / void PrintScore(int型スコア[ ]、int型N){int型* Y = TEMP。}

 

 

([]、INT nは、INT(*比較)(INT A、INT B)INT)ボイド選択ソート

コンパイラ機能はポインタであり、ポインタは2つの整数変数パラメータを指すことができ、関数は、整数値を返す、パラメータを比較選択ソート告げます

関数ポインタは、いずれかの機能昇順()を指すことができ、機能)が降順(向けることができます

それは達成するための昇順または降順、一般的なソート機能で可能です

 

関数ポインタの定義は、関数へのポインタのかを指定するが、関数ポインタの割り当てによるプログラムに呼び出し元の関数で別のポイントを達成するために、異なる機能を指していなかったが、

関数ポインタを使用したプログラミングは、重複コードを削減、手続きの汎用性、シンプルさを改善するのに役立ちます

 

おすすめ

転載: www.cnblogs.com/dingdangsunny/p/11372728.html