1.指针的类型
a)空指针
int *p=nullptr;
b)野指针
int *p;
c)实效指针(失能指针)
int *p=(int*)malloc(sizeof(int)*5);
free(p);
注意:不要形成野指针和失效指针,容易造成很严重的问题。
指针可能占用4个字节(32位),也可能占用8个字节(64位)。
2.指针的声明
int *p; //*和p结合,不是和int
int *s,t;//s是指针,t不是指针
(int*)s,t;//把s和t强转为指针类型
3.指针的使用
int main()
{
int a=10;
int b=20;
int *p=&a;
*p=100;
p=&b;
*p=200;
return 0;
}
4.指针的运算
指针+指针:错误
指针-指针:指针相减,结果是类型元素的个数
指针++:指针类型不同,加1能力不同
指针+整数:类型不同,加的字节数不同
int a[10];
char b[10];
int *p=&a;
int *s=&b;
p++; //由指向a[0]到指向a[1],加4字节
s++; //由指向b[0]到指向b[1],加1字节
p=p+3; //由指向a[1]到指向a[4],加12字节
s=s+3; //由指向b[1]到指向a[4],加3字节
x=*p++;
等价于
x=*p;
p++;
注意:x=*p++和x=(*p)++ 不一样
y=*++p;
等价于
p=++p;
y=*p;
5.指针的应用
指针多用于值传递
void swap(int *a,int *b)//如果不使用指针,做不到交换x和y的作用,只能交换a和b
{
int temp;
int temp=*a;
*a=*b;
*b=temp;
}
int main()
{
int x=10;
int y=3;
swap(&x,&y);
return 0;
}
6.void类型的指针
void可以用来定义函数,说明函数无需返回值;
void不可以用来定义变量;
void可以用来定义指针,且可以存放任意类型变量的地址。
void *p=nullptr;
int a=1;
float b=12.5f;
double c=12.35;
p=&a; //正确
p=&b; //正确
p=&c; //正确
sizeof(p); //正确,4(32位)或8(64位)
sizeof(*p); //错误,无法确定是什么类型
int *p2=p; //错误
int *p3=(int*)p1;//正确,需要强制转换
double *p4=(double*)p1;//正确
p++; //错误,无法确定类型,不知道加多少字节
6.1void类型指针的应用
void *p适用于有很多类型时候,p指向个类型赋值。
void setzero(void *cp,int size)
{
char*p=(char*)cp;
for(int i=0;i<size;i++)
{
p[i]=0;
}
}