配列とポインタ


453p
変数と配列は自動ストレージクラスに属します.異なるストレージクラスには異なる特性があります.
455p
アレイの指定初期化
int arr[6] = {[5]=123}; => {0,0,0,0,0,123}
457p
Cは、1つの配列全体を別の配列に置き換えることを許さない.(for loopを使用する)初期化時にリスト値をリストし、カッコで囲むことはできません.
460p
Cは配列のインデックスが有効かどうかをチェックしないため、迅速に実行されます.
461p
int n=5; int n=8;
float a8[n]; float a9[m]; => 可変長配列
467p
配列名は、配列の最初の要素のアドレスです.
arrは&arr[0]です.
468p
通常、システムはバイト単位でアドレスします.Cではポインタに1を加えると「記憶単位を1つ加える」ことを示す.短い(2バイト)配列に1を加えると、0番目の要素アドレス値+2 byte
* 연산자를 적용하면 그 포인터가 가리키는 객체의 저장되어 있는 값을 얻는다.

int * temp;
temp  = arr => &arr[0] ;
arr+2 => &arr[2] / *(arr+2) = arr[2]
間接演算子は+より優れている.
ar[n] => (ar+n)
472p
配列が伝達因子として伝達されると、通常、配列の大きさも伝達因子に伝達される.(または、最後の要素+1を指すポインタをスキップすることができます.)
482p
ポインタ間の差を求める場合、int arr[4]={...}
temp1 = arr; temp2 = &arr[2];
temp2-temp1 = 2
ここでの2は2 bytesを意味するのではなく,距離2 indexを意味する.
初期化されていない逆参照は危険です.
int ptr; ptr=5; => ptrの指すところに5をかぶせる
しかしptrは初期化されていないポインタであり,ランダムアドレスがランダム値を上書きすることは危険である.
484p
int型のようなデータベース型では、プログラムが値を変更する必要がない場合は、数に値を渡し、ある場合はポインタに渡すことが望ましい.
配列については,効率のためにポインタを移動せざるを得ない.(データの整合性は危険ですがconst制限子を使用して制御します)
487p
double rate[5] = {....};
const double * pd = rates; pdを使用して値を変更することはできません.
タイル:データ付きタイル/cstタイル:定数付きタイル
constポインタ:定数のポインタを指すため、通常は配列、const配列を指すことができます.
≪一般ポインタ|General Points|emdw≫:データを指すポインタなので、一般配列のみを指すことができます.
double * const pc = rates;
PC=&rates[3]=>エラーが発生しました.
配置constの位置を変更することで、ポインタが他の位置を指すことを防止できます.
const double * const pc; => 値を変更したり、他の場所を指したりすることはできません.
多次元配列のポインタ
int zippo[4][2];
zippo:配列の最初の要素のアドレス&zippo[0](int型の2つのオブジェクトアドレス)
zippo[0]:最初のint型要素のアドレス&zippo[0][0](int型サイズのオブジェクトアドレス)
zippoとzippo[0]は同じ位置から始まるのでzippo=zippo[0]
*(zippo[0]) = zippo[0][0]
*zippo = zippo[0] = &zippo[0][0]
** zippo = *zippo[0] = zippo[0][0]
492p
マルチカラムポインタ
 int (* pc)[2]; int형 원소 2개인 배열을 가리키는 포인터 
 int * pc[2]; int형 포인터를 가지는 크기가 2인 배열
 ([]가 *보다 우선순위가 높다.)
 
  p2[m][n] = *(*(p2+m) + n)
494p
ポインタはデータ型に厳しい.
int *pt; int (*pa)[3]; int ar1[2][3];
int ar2[3][2]; int **p2;

pt = &ar1[0][0]; int형을 가리키는 포인터
pt = ar1[0] ; ''
pa = ar1; int형 크기3 배열을 가리키는 포인터
p2 = &pt; int형 크기3 배열을 가리키는 포인터를 가리키는 포인터
*p2 = ar2[0]; int형을 가리키는 포인터
constキーワード
int x=20; const int y=23;
int *p1=&x; const int *p2 = &y;
const int ** pp2;

p1=p2 ; 안전하지 않다.(const가 아닌 것에 const 대입)
p2=p1; 유효
pp2=&p1 안전하지 않다. (중첩 포인터에 대입한다.)
constポインタを非constポインタに置き換えると定数が変更されるため、安全ではありません.また,constに非contを代入することは,2回以上の間接演算を適用しても安全ではない.
const int **pp2; int *p1; const int n =13;
pp2 = &p1;
*pp2 = &n;
*p1 = 10; => const n 이 10으로 변경된다.
497p
デュアルポインタのフォーマット伝達係数
void somefunction(int (*ptr)[4], int ptr[4]);
500p
N次元配列のフォーマット伝達係数は、一番左の角カッコ以外のすべての角カッコの値を指定する必要があります.
int somefunction(int arr[][1][2][23]);
最初の角カッコはポインタを表すため、残りの角カッコはオブジェクトを指すデータ型を表します.(int somefunction(int(*arr)[1][2][23])と同じ)
501p
配列の次元を表すには定数しか使用できないという制約があります.
任意のサイズの2 D配列に使用できる関数を作成する場合は、可変長配列(VLA)を使用します.
int quarters = 4; int regions = 5; 
double sales[regions][quarters];
VLAとは,自動メモリクラスを用い,静的,外部メモリクラス変更者を用いず,関数内,関数パラメータとして宣言することを意味する.(宣言から初期化できません.)
505p
可変長配列では、ダイナミックメモリ割り当てが可能になります.これは、実行中に配列のサイズを指定できることを意味します.
通常、Cの配列(コンパイラは配列の大きさを定数とし、コンパイル時に決定する)は静的メモリ割り当てを使用する.
506p
文字の意味は記号ではなく定数です.(5はint型、yはchar型、eleは文字列の文字)
配列の複合テキストは(int[2]){10,20}である.
複合文字には識別可能な名前がないので、再利用のためにポインタを付けます.
509p
C配列を派生データ型とする.(他のデータ型に基づいて作成)