配列変数名は、定数ポインターと見なすことができます。ポインターとして扱うことはできますが、変数名の値を変更することはできません。
たとえば、配列を作成し、添字を使用するか、ポインター演算とアスタリスク (*) 記号を使用した逆参照を使用して、配列の要素にアクセスできます。
char myArray[20]; // an array of 20 characters
myArray[2] = 'C'; // assigning a value of the letter C to the third element of the array
*(myArray + 2) = 'K'; // assigning a value of the letter K to third element of the array
char *pmyArray; // a pointer to one or more characters, not yet initialized though.
pmyArray = myArray; // assigning the address of the first element of the array to my pointer
*(pmyArray + 2) = 'J'; // assigning a value of the letter J to third character after the character pointed to by pmyArray
ポインタの値はインクリメントできます。例えば:
pmyArray++; // increment by one position
pmyArray = pmyArray + 1; // increment by one position
pmyArray += 1; // increment by one position
ただし、配列名は真のポインター変数ではなく、ポインター定数に似ているため、ポインター変数をインクリメントできる方法で配列名をインクリメントすることはできません。インクリメントされるポインタの良い点は、型の次のメモリ アドレスのアドレスにポインタを移動するために必要なバイト数だけ、実際のアドレスが増加することです。
例えば:
char myArray[48];
char *pmyChar = myArray;
short *pmyShort = (short *)myArray; // use cast to assign address of array to pointer
long *pmyLong = (long *)myArray;
これらのステートメントでは、3 つの異なるポインターはすべて同じメモリ アドレス、つまり文字配列 myArray が始まるアドレスを指します。ただし、これらの各ポインターを次のようにインクリメントすると、次のようになります。
pmyChar++; // increment by one to next character
pmyShort++; // increment by one to next short
pmyLong++; // increment by one to next long
これらの各ポインターには、異なるアドレスが含まれるようになります。ポインター pmyChar には、文字配列 myArray の 2 番目の要素のアドレスが含まれます。これは、myArray が char 配列であるのと同様に、pmyChar が char ポインターであるためです。
ポインター pmyShort は、文字配列 myArray の 3 番目の要素のアドレスを含みます。これは、pmyShort が short ポインターであり、short には 2 バイト (各 char は 1 バイト) が含まれ、pmyShort のインクリメントは、配列に含まれるアドレスを増やすことによって行われるためです。 char のサイズではなく、short のサイズによるポインタ変数。
ポインター pmyLong には、文字配列 myArray の 5 番目の要素のアドレスが含まれます。これは、pmyLong が long ポインターであり、long には 4 バイトが含まれているためです。 long であり、char のサイズではありません。
次のようなポインタへのポインタを持つこともできます。
char myArray[48];
char *pmyArray;
char **pmyPointerToMyArray;
pmyArray = myArray; // pointer to myArray
pmyPointerToMyArray = &pmyArray; // address of pointer to myArray
次に、次のようなことができます。
pmyArray++; // increment to second element of myArray
*(pmyArray) = 'J'; // set the second element of myArray to letter J
*(*pmyPointerToMyArray) = 'K'; // set the second element of myArray to letter K
この最後のステートメントが行うことは、変数 pmyArray のアドレスである pmyPointerToMyArray が指す値を取得し、その値を文字 K を配置する文字のアドレスとして使用することです。