*p表示获取p所表示的地址的单元内容的值
&q表示获取q的地址
例如:
i→1;&i→0x2000;p→0x2000;&p→0x3000;*p→1;q→0x3000;&q→0x4000;*q→0x2000;**q→1;
直接访问:i;一级间接访问:p;二级间接访问:q
指针的大小是根据平台而确定的值。
指针变量与所指向的值一定要是相同类型。
指针要有明确指向,否则会变成野指针,不知道指针应指向哪块空间时,应定义为空指针。
void *p 空类型指针,不确定数据类型时使用,可以匹配任意数据类型。
a是数组名表示地址常量,p是指针,表示的是变量,a++不能执行,因为是常量,p++可以执行,因为是变量。
a[i]:a[i] = (a+i)=(p+i)=p[i]
&a[i]:&a[i]=a+i=p+i=&p[i]
使用指针也能声明数组,int *p = (int [3]){1,2,3}
二级指针存放一级指针的地址,而二维数组的数组名并不是指针,只是单纯的数组首地址,对任何维度的数组,数组名永远都是数组的首地址。
数组指针与指针数组:数组指针:【存储类型】 数据类型 (*指针名)【下标】= 值
在某种数组大小下移动的指针 int (*p)[3]=a 数组指针的使用与数组名类似,但是数组指针为变量。
指针数组:【存储类型】 数据类型 * 数组名【下标】
在某个数组中存放多个指针。
static void name(void)
{
int i,j,k;
char *name[5] = {"ana","marry","john","kandy","cindrela"};
char *tmp = NULL;//未知指向的指针要声明为空指针
for(i = 0;i<4;i++)
{
k = i;
for(j = i+1;j<5;j++)
{
if(strcmp(name[k],name[j])>0)
k = j;
}
if(k != i)
{
tmp = name[i];
name[i] = name[k];
name[k] = tmp;
}
}
for(i = 0;i<5;i++)
puts(name[i]);
return;
}
字符指针和字符数组的区别:
字符数组是给字符串分配了一段空间用来存放字符串,可以改变其中的内容;字符指针则是指向某字符串常量的地址,不能改变其中的内容,只能通过改变指针的指向来改变内容。
常量const:常量指针表示指针的指向可以变化,而指针指向的地址内容不可以发生改变。
指针常量表示指针的指向不可以发生改变,但指针指向的内容可以改变。
const只是不能通过const修饰的变量名进行改变,并不代表这块空间不可以变化



