ポインタ付与int a[5]={......},a、&a[0]、&aの3つの違いC/C++就職面接の必須ポイント(5)

3332 ワード

まず、コードを見てみましょう.
#include <stdio.h>
void main()
{
char a[] = "BruceLee!";
char *p = a;
printf("%c
", *(p+4)); printf("%c
", p[4]); printf("%s
", p); printf("%c
", a[4]); printf("%c
", *(a+4)); printf("%s
", a); }

まず、プログラムは文字配列aを宣言し、初期化します.これはデフォルトの後に'0'が付いていることを覚えています.そして文字ポインタが宣言され、配列aのヘッダアドレスであり、a[0]のアドレスでもある.
char *p = a;    char *p = &a[0]

.*(p+4)=p[4]=a[4]=*(a+4)となり、これが最終的な結果となる.ここで注意すべきは、文字ポインタpと配列の名前aのそれぞれに2つの参照方法があり、1つは配列の参照方法、例えばa[4]、1つは*(a+4)、ポインタの方法である.
ここの
printf("%s
", p);
BruceLee!

つまり、 たちは*(p+4)だけで を ていますが、pの は わりません.pは としてヘッダアドレスを しているので、 された もヘッダから まります.
コードにこの2つを すると、
printf("%c", *p++); printf("%s", p);
の の は、 の 「B」を し、pを1 ろに します.だから の1つの は、2 の から まり、 はruceLeeです.
まとめ:(*p+4)この ではポインタpの は されていません.p+、p-、またはp+=4のような でのみ、ポインタpの が されます!
に を します.
#include <stdio.h>
void main()
{
    int a[5] = {1, 2 ,3 , 4, 5};
    int *p = a;
    printf("%d
", a[0]); printf("%d
", *p); printf("%d
", p); int *q = (int *)a; printf("%d
", q[0]); }

なのは2つあります.
1,
printf("%d
", p);

この は に できず、 aに のない が されます.printf("%s",p)pを にアドレスを しないでください.このように a の を しようとします!
2,int *p = a; int*q=(int*)aと、この2つの の は じで、ここで の を えなくても じです.
この いの い を てみましょう.
#include <stdio.h>
void main()
{
    int a[5] = {1, 2 ,3 , 4, 5};
     int *m = (int *)&a[0];
     printf("%d
", *(m + 1)); int *p = (int *)&a; printf("%d
", *(p + 1)); int *q = (int *)(&a + 1); printf("%d
", *(q-1)); int *w = (int *)(&a[0] + 1); printf("%d
", *(w-1)); }

3つのポイントがあります.
1、 では(int*)あってもなくてもいいと っていますが、&を けた 、int*m=(int*)&a[0]ここで、 をしないとアラームになります.ここでアドレスを ったので、 したほうがいいです.
2,(int*)(&a[0])と(int*)(&a)は、 mとpの から て、この2つの に いはないようですが、 はそうではありません!&a[0]=aは、いずれも aを すヘッダアドレス、すなわちa[0]のアドレスです.しかし&aは、 、すなわちaという のヘッダアドレスです.その のポインタqの に いて、&a+1はいったい のアドレスなのでしょうか.
ポインタに1を える で、 のアドレスの ではなく の のアドレスが られることを えておいてください.タイプがxであると すると、1を えるとポインタがsizeof(x)を ろに し、 はsizeof(x) である!
はどうして えば うほど からなくなって、 はaと&a[0]と&a、3つの いです!
の2つは です.&aも で べたように、aを と なすので、&a+1はaの のオブジェクトのアドレス、すなわち&a+1であり、aまたは&a[0]に して、sizeof(a)=5*4=20バイト した、すなわちここでポインタqはaを す[5]!だから*(q-1)の は5、つまりa[4]の である. の のために に(&a[0]+1)を って し、wは にa[1]、*(q-1)の は1、つまりa[0]の を す.
3,int*n=aはint*n=(int*)&a[0]に であり, にもint*n=(int*)&aに である.
しかし、ポインタの がある 、 の は して じではありません!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
えば、int*n=(int*)(&a[0]+1)はint*n=(int*)(&a+1)に しくない.