指针的赋值,运算,字符串赋值,常见错误

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

猜你喜欢

转载自blog.csdn.net/weixin_45454859/article/details/103843472