指针是什么?
简单来说指针就是地址,我们平常口头上说的指针常常指的是指针变量
#include<stdio.h>
int main()
{
int a=10;
int*p=&a;
*p=10;
printf("%d",a);
return 0;
}
这里的*p就是一个指针变量,我们通过当a的地址赋给p然后通过解引用操作符*将a的值改成20。
像整型浮点型等这些都有相应的字节大小,那么指针变量的大小是多少呢??
由图可知char类型的指针和int类型的指针的大小都是4个字节,但这是在你的电脑支持32位虚拟空间的值,如果你的电脑是64位的话就是8个字节、如果是在vs里面X86下是4个字节,但X64则是8个字节
虽然各种类型的指针都是4个字节(按X86下来说)但是每种类型的作用都有不同我们来看下面这两段代码
#include<stdio.h>
int main()
{
int a = 0x11223344;
int* p = &a;
*p = 0;
return 0;
}
#include<stdio.h>
int main()
{
int a = 0x11223344;
char* p = &a;
*p = 0;
return 0;
}
首先第一段代码我们开始调试通过内存窗口发现所有都变成了0但到了第二段代码时我们发现就只有最前面的一个字节变成了0
由此我们可以发现int类型指针能操作4个字节,但char类型的指针就只能操作一个字节了,因此,指针类型决定了在被解引用时的访问权限还决定了指针向前或者向后走一的步的距离。int类型则时走4个字节,char则是1个字节
野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)指针变量在定义时如果未初始化对于野指针我们应该要注意以下几点
1:指针初始化
2:小心指针越界
3:指针释放即置NULL
4:避免返回局部变量地址
5:指针在用前检查有效性
指针的运算
指针加减整数
通过指针和整数之间的运算达到访问数组的目的
指针和指针之间
指针和指针相减得到的是两个指针之间元素个数的绝对值但是前提是两个指针必须是要指向同一块空间的,比如下面的代码
数组名
数组名就是数组首元素的地址,但有两个例外
1:sizeof(数组名)此时表示整个数组的大小
4*5=20,所以是全体数组的大小
2:&数组名此时取出的则是全体数组的地址
由图可知当&数组时+1跳过的时整个数组
二级指针
此时的pp则是一个二级指针
指针数组
这里的arr就是一个指针数组,里面存放的时指针;