1、什么是指针?
计算机中所有的数据都必须放在内存中,不同类型的数据占用不同的字节,char:1字节,int:4字节,为了可以正确的访问这些数据,必须为每个字节编上号码,每个字节的编号都是唯一的,我们将内存中字节的编号称为地址或指针。
对于32位操作系统,程序能够使用的内存为4GB(2^32),最小地址为0x0000 0000,最大地址为:0xFFFF FFFF
2、指针变量的定义
int *p = &value;
*表示这是一个指针变量,int,表示是这个指针变量所指向的类型(整型)。
指针是内存的地址,指针变量就是保存了地址变量。
int main()
{
int a = 10,b = 20;
int *ip = NULL;
ip = &a;;
*ip = 100;
ip = &b;
*ip = 200;
return 0;
}
指针的大小:在32位:4字节 64:8字节
int main()
{
int *ip = NULL;
int a = 10;
ip = &a;
*ip = 100;
return 0;
}
ip 存放的是a的首地址(低地址)。
小端存储 (高字节存储在高地址,低字节存储在低地址)
3、指针的应用
(1)值传递和指针传递
值传递:形参的改变并不会改变实参
指针传递:实参的地址给形参指针,通过指针间接改变实参的值。
void Swap(int *ap,int *bp)
{
int c = *ap;
*ap = *bp;
*bp = c;
}
int main()
{
int x = 10,y = 20;
Swap(&x,&y);
return 0;
}
实参压栈,实参-》形参从右向左
void fun(int *p)
{
int a = 200;
*p = 100;
p = &a;
}
int main()
{
int x = 0;
int *s = &x;
fun(s);
printf("%d %dn",x,s);?//100,100
return 0;
}
野指针 空指针
不能使用野指针
如何避免野指针,int *p = NULL;当程序运行时,当指针解引用的时候就会提示指向了空地址,防止野指针出现,造成严重后果。因此当定义指针的时候一定要进行判空。
定义指针变量要初始化
int main()
{
int a;//随机值
int *ip;//野指针
a = 10;
a = *ip;
*ip = 100;
return 0;
}
空悬指针(失效指针)
int *fun()
{
int a = 100;
int *p = &a;
return p;
}
int main()
{
int *ip = NULL;
ip = fun();
if(ip != NULL)
{
printf("ip %p => %dn",ip,*ip);
}
return 0
}
void PrintAr()
{
int x = 20;
int ar[10];
}
int *fun()
{
int a = 100;
int *p = &a;
return p;
}
int main()
{
int *ip = NULL;
ip = fun();
PrintAr();
if(ip != NULL)
{
printf("ip %p =>*ip %dn",ip,*ip);
}
return 0;
}
如代码演示:当fun()函数调用结束,栈帧被释放,当解引用的时候,还有残留的数据,当在代码中加了PrintAr()之后,fun()函数栈帧释放,新的函数会重新开辟栈帧,解引用就会出现错误。因此:不要把一个局部变量的地址返回,他已经失效。
:当我们变量的生存期不受此函数影响时,我们就可以通过函数返回此变量的地址 静态局部变量,全局变量在.data区,不在栈区



