数组与指针(1)

数组与指针

指针也是一种变量,代表着指向一个地址

指针变量里面存的值是一个数字,数字是几就代表指向内存的哪里

指针的赋值

一般情况下指针会用一个有意义的地址来赋值(&代表取地址)

int a[10];
int v;
int *pa=a;
int *pv=&v;

上面的数组a可以赋值给pa是因为数组名字就代表了数组的首地址

解引用

解引用就是代表获得这个地址指向那块内存的值,这个值如何解释由这个指针的类型决定

举个例子:

int ans=4;
int *pans=&ans;
*pans=5;
printf("%d\n",ans);

由于pans指向的是ans的地址,我们对*pans赋值操作,ans也会被改变

再来一个例子:

我们知道一个 int 的占用空间是32bit 一个char占用空间的大小8bit

char a[4]={1,2,3,4};
int *p=a;
printf("*p:0x%x\n",*p);

%x代表16进制输出的,可以看到我们定义的char数组按照 int类型解释了

我们对*p操作也将会影响到char数组

还有一种解引用就是结构体指针可以使用->操作

简单的应用

函数传参:

我们在函数传参数的时候,如果我们想在函数体内改变一个外部变量,通常情况下需要传递这个指针

在传递数组的时候,我们通常是传递这个数组的首地址,而不是这个数组的拷贝

我们在遍历数组的时候可以使用指针,更高效的操作

int a[10];
int *pa=a;
int *ped=pa+10;
while(pa<=ped)
{
    //do something
    pa++;
}

还有一点需要注意的就是,指针做加减运算的时候每次偏移量是sizeof(type)

数组和指针的区别

数组名字代表首地址,我们在使用数组的元素的时候a[i],相当于*(a+i)

我们在使用数组的时候甚至可以这样:

int a[10];
4[a]=5;//等效a[4]=5;

不过最好不要这样做,容易引起别人的困惑

但是数组名是不可以被赋值,不能使用自增自减操作

我们对数组进行sizeof操作时候,得到的是数组的实际大小,对指针操作时,只能得到指针长度大小

int a[10];
sizeof(a);
int *pa=a;
sizeof(pa);

猜你喜欢

转载自www.cnblogs.com/stdpain/p/10493862.html