数组与指针
指针也是一种变量,代表着指向一个地址
指针变量里面存的值是一个数字,数字是几就代表指向内存的哪里
指针的赋值
一般情况下指针会用一个有意义的地址来赋值(&代表取地址)
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);