指针要素:
1.指针变量类型 一般为变量类型*,特制指针变量。
2.指针变量长度 指针变量是存储地址的 ,故长度为地址位数。
3.指向哪 指针变量存储的地址值,即指针变量的值
4.指向的变量参数(类型,长度)
*取指针指向的变量。
&取变量占用的内存地址,一般可赋值给指针变量。
需要注意的是指针运算符*和指针变量说明中的指针说明符* 不是一回事。在指针变量说明中,‘*’是类型说明符,表示其后的变量是指针类型。而表达式中出现的‘*’则是一个运算符用以表示指针变量所指的变量
因为在申明时*为类型说明符,所以此时赋值给指针变量的值为地址,而不是变量值。
如int c=1;int *p=c;是错误的,而应该是int *p=&c;
又或c是一个数组名,int *p[]={a,a+1,a+2,a+3};a为数组名,可看做一个指针变量,a+1为指向a[1]的指针变量,其他同理。
剖析*号符:
在声明指针时,*起说明符作用,而不是取指向变量
1.char *p --> (char *)p -->p是一个char *类型变量//或者*p为char类型,即要素4。
故char *类型变量为指向char变量的指针
2.char **p -->(char *)*p -->*p是一个char *类型变量即char类型指针变量--》p为指向char 类型指针变量的指针变量(为char **)类型变量。
故char **类型变量为指向一个char *类型指针变量的指针,即指向指针的指针。
3.char *p[]-->(char *)p[]-->p[]是一个数组,且数组每个元素都是char *类型变量(具体看1)。
4.char **p[]-->(char *)*p[]-->(char **)p[]-->p[]是一个数组,且每个元素都是char **类型(具体看2)
5.char (*p)[]-->(*p)[]为一个char数组,而(*p)是char数组首地址-->p为指向char数组首地址的变量。即指向地址(此地址不是指针变量)的指针变量。
解决指针问题最好用画图法,把结构对应画出来。
我认为最需要搞清楚的是第3个,指向哪
犯的错误如下:
(1)char *p=‘a';
(2)char *p;*p='a';
(3)char *p,c;c='a';*p=c;
此时,只是定义了一个char *类型的指针变量,第3要素一般为null,不知道指向哪。可以理解为没有分配内存空间。
此时给他赋值,会出现错误。
第三种特别注意,*为取指针变量所指向的变量,此时还没有指向变量,故不可这样赋值,而用p=&c;将变量地址赋给指针变量。
需要注意的是,当用指针来操作字符串时,可以直接赋值,如char *p=”I love“;或char *p;p=”i love“;
因为”i love“可看做一个地址,指向此常量的首地址。
数组名可当做一个指针变量(指向数组首地址的指针变量)。
printf中的使用%s与%c
printf("%s",p);
printf("%c",*p);
用%s时使用首地址,即指针。使用%c时使用此指向变量(用*取指向变量)