1.指针的赋值问题
可以给一个指针赋值的只能是一个与该指针同类型的指针(或地址值);
例如:
int x=10;
int *p=&x;
或者:
int a[10],p1;
int *p=a;
p1=&a[0];
或者:
int x,*p;
p=&x; //p指向a的地址
*p=10; //将10写入p指向的内存空间,相当于对a赋值
printf("%d",a); //输出的值是10
但这样是绝对错误的:
int *p=10;
因为直接赋值,就是让这个指针指向这个赋值的地址,如果这个地址是你计算机内部的某个程序的或者是系统的某个地址,而这个指针的值又改变了,那么计算机系统就会出现问题.
int *p=NULL; //正确
int *p1=0; //正确
2.指针的运算
*p++和(*p)++之间的区别:
printf("%d\n",*p++);
表示先输出p所指向的值,然后p向后移动一个存储单位,即,之前p指向的是a[0],那么这个语句之后,p指向的是a[1];
(*p)++则是指针变量所指的数据加一
注意:数组名不能自增,因为数组a是个常量地址,它永远指向数组的首地址,不能重新赋值
int a[10];
a=&i; //错误
a++; //错误
3.二维数组和数组指针
数组指针(行指针):int (*p)[4]
,这个指针p是指向一个一维数组,这个一维数组中包含4个元素。所以能跟这个行指针类型匹配的是一个一维数组。
二维数组:int a[3][4]
由若干个一维数组组成,可以看成二维数组的元素就是一维数组。类比于一维数组,二维数组的a[0],a[1],a[2]是一维数组名(也相当于二维数组的元素),a[0]代表数组元素a[0][0]的地址(相当于一维数组int b[4]
的b代表b[0]的地址,也是一维数组的首地址),即&a[0][0]
int a[3][4]
中,a相当于一个二维指针,而a[0]是一个一维指针
int a[3][4];
int *p=a; //错误
int *p=a[0]; //正确
int *p=&a[0][0]; //正确
或者:
int a[3][4];
int *q[4]=a[0]; //正确
4.指针与字符串
把字符串赋值给指针,相当于把字符串的首地址传给指针;
故给指针赋值字符串时,不能在两边加花括号。
char *s;s="hello"; //正确
char *s={"hello"}; //正确
char *s="hello"; //正确
char *s;s={"hello"}; //错误
5.指针做形参
可以这样使用:
扫描二维码关注公众号,回复:
11321891 查看本文章
void(char *c){....}
int main()
{
char a='A';
fun(&a);
....
}
6.常见错误
1.野指针:
char *c;
scanf("%s",c); //错误
//因为字符指针未被赋值,是一个不确定的值,指向一个不确定的内存空间,这个区域可能存放有用的指令或数据,所以在声明一个指针变量的时候都先让它们指向NULL