ポインタノートと思考ガイド
2628 ワード
演算子&
オペランドを取るためのアドレスはscanf("%d",&i);の&変数のアドレスを取得し、操作数は変数int iでなければなりません.printf("%x", &i); アドレスのサイズがintと同じかどうかはコンパイラint iに依存する.printf("%p", &i);
ししん
アドレスを保存する変数int iです.一般変数int*p=&i;iのアドレスをpに割り当てる.int* p,q; qは通常変数であり、pはポインタint*p,qである.qは通常変数、pはポインタ星の位置に影響しません
ポインタ変数
変数の値はメモリのアドレス普通変数の値は実際の値ポインタ変数の値は実際の値を持つ変数のアドレスです
パラメータとしてのポインタ
void f(int *p); 呼び出されたときに変数のアドレスが得られた:int i=0;f(&i); 関数の中でこのポインタを通じて外のこのiにアクセスすることができます.
そのアドレスの変数にアクセス*
*は、ポインタの値が示すアドレス上の変数にアクセスするための単一演算子です.
int k = *p;
*p = k+1;
関数パラメータテーブルの配列は実際にはポインタです
sizeof(a)==sizeof(int*)は配列の演算子[]で演算できる以下の4つの関数プロトタイプは等価である
int sum(int *ar, int n);
int sum(int *, int);
int sum(int ar[], int n);
int sum(int [], int);
配列変数は特殊なポインタです
配列自体がアドレスを表すのでint a[10];int* p=a; aのアドレスを取る必要はありませんが、配列のユニットは変数を表しています.&アドレスを取る必要がありますa=&a[0][]演算子は配列に対してもいいし、ポインタに対してもいいです.p[0]はa[0]に等価です.*演算子はポインタに対してもいいし、配列に対してもいいです.*a=25;配列変数はconstのポインタなのでint a[]はint*const aに等価ではありません
ポインタでシーンを適用
1.2つの変数の値を交換する.関数は複数の値を返し、一部の値はポインタによってのみ2.1入力パラメータを返すことができ、実際には持ち帰った結果を保護する必要がある変数2.2関数は演算の状態を返し、結果はポインタによって3を返す.一般的なループは、エラーを表すために関数に有効範囲外の特殊な値を返すことです.0または-1
ポインタがconstの場合
int *const q = &i; //q const
*q = 26; // OK
q++; //ERROR
constの場合
このポインタでその変数を修正できないことを表す(その変数をconstにすることはできない)
const int *p = &i; (*p) const
*p = 26; //ERROR
i = 26; //OK
p = &j; //OK
次の4つの定義の意味
int i;
const int* p1 = &i; *p1 const
int const* p2 = &i; *p2 const
int *const p3 = &i; p3 const
へんかん
常にconst以外の値をconstに変換することができます.
void f(const int* x);
int a = 15;
f(&a); //OK
const int b = a;
f(&b); //OK
b = a+1; //ERROR!
これは,伝達するパラメータのタイプがアドレスより大きい場合によく用いられる手段である.
ポインタを1つ追加した場合
1つのポインタに1を加えると、次の変数にポインタを向けることができます.
int a[10]; int *p = a[0]; *(p+1) ==> a[1]
ポインタが配列のような連続的に割り当てられた空間を指していない場合、この演算は意味がありません.
ポインタ演算
これらの算術演算では、ポインタに整数(+,+=,-,-=)を加算、減算することができます(++,-)
ポインタ比較
, >=, != メモリ内のアドレス配列のセルアドレスが線形に増加していることをポインタで比較することができます.
ポインタのタイプ
どんなタイプを指すにしても、ポインタの大きさは同じです.アドレスですが、異なるタイプのポインタを指すには、ポインタを間違えないように直接値を割り当てることはできません.
ポインタの使い道
パラメータとして大きなデータを入力して配列に入力した後、配列を操作する関数として1つ以上の結果を返すには、関数を使用して1つ以上の変数の動的申請のメモリを変更する必要があります...