目录
&取地址操作符
int a = 10;//1、创建一个变量a,并赋值为10;2、在内存上申请一个4个字节的空间
printf("%p\n", &a);//%p专门打印地址
*解引用操作符
int main()
{
int a = 10;
printf("%p\n", &a);
int* pa = &a;//pa是指针变量--存放地址--地址又被称为指针,指针变量是用来存放指针的
*pa = 20;//*解引用操作符
//也就是等于a=20;
return 0;
}
int* pa = &a
1、*:说明pa是指针变量
2、int:说明pa指向的对象是int类型
指针变量大小
指针变量是专门用来存放地址的,指针变量的大小取决于一个地址存放需要的空间。
32位机器上:地址线是32根,地址的二进制序列就是32bite位----要把这个地址存起来,就需要4个字节的空间,也就是32bite的空间。
所以32位机器上指针变量的大小就是4个字节。
同理,64位机器上指针变量的大小是8个字节。
int main()
{
int a = 0x11223344;
char* pa = &a;//?这里pa可以存放下a的地址吗?---当然可以,pa是一个指针变量,大小是8个字节
*pa = 0;//但是这时改动的只有一个字节
printf("%d\n", &a);
}
指针类型的意义
int main()
{
int a = 10;
int* pa = &a;
char* pc = &a;
printf("%p\n", pa);
printf("%p\n", pc);
printf("pa+1=%p\n", pa+1);
printf("pc+1=%p\n", pc+1);
}
打印结果:
000000C7CBBCF7F4
000000C7CBBCF7F4
pa+1=000000C7CBBCF7F8
pc+1=000000C7CBBCF7F5
解释:
因为char *和int *的指针类型不同造成pa+1和pc+1的不同
void*
int a = 10;
int* pa = &a;
char* pc = &a;
对于上面的代码,虽然可以正常运行,但是会出现一个警告:
怎么去解决这个warning?
1、将 char* pc = &a;改为:char* pc = (char *) & a;
2、将 char* pc = &a;写成: void* pc = & a;// void 指针可以指向任意类型的数据;
int main()
{
int a = 10;
char c = 'w';
//int* pa = &a;
//char* pc = &a;//警告
void* pv = &a;
void* pv1 = &c;//并不会报警告
//*pv = 20;//err void *类型的指针 不能直接进行解引用操作
//pv++;//err
}
const
const修饰变量:
int main()
{
int a = 10;
a = 20;//修改
const int a = 10;
a = 20;//不可修改,但是a的本质还是变量,const,仅仅是在语法上做了限制,a叫常变量
printf("%d", a);
}
const修饰指针:
const修饰指针的时候:
(1)const可以放到*左边;
(2)const也可以放到*右边;
左边:
const int *pa和int const *pa其实是等价的
const限制的都是*pa
限制的是*pa:不能通过pa来修改pa指向的空间的内容
const int a = 10;
const int* pa = &a;
*pa = 1;//不能修改
printf("%d", a);
右边:
int *const pa,const限制的是pa而非*pa
const int a = 10;
int*const pa = &a;
*pa = 1;//可以修改,因为const在*右边限制的是pa,并不是*pa
printf("%d", a);
int main()
{
int a = 10;
int c = 1;
int const* pa = &a;
//*pa = 0;
printf("%p\n",pa);
pa = &a;
printf("%p\n", pa);
pa = &c;
printf("%p\n",pa);
}
还是上面的图
pa里面存放的是a的地址;
pa=&a;意思是将pa里面存放的值改为a的地址;
pa=&c;意思是将pa里面存放的值改为c的地址;
pa里面存放的地址是a的地址;
pa是变量,它有它自己的地址;
*p是p指向的空间;
野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)。
造成野指针的原因:
指针未初始化;
指针越界访问;
指针指向空间释放;
如何规避:
1、初始化
2、小心越界
3、及时置NULL
希望有所帮助!