目录
1.指针是什么
2.指针类型
2.1指针类型的意义(+-整数)
2.2指针的解引用
3.野指针
3.1野指针出现的情况
3.2 如何规避野指针
4.指针运算
4.1指针+-整数
4.2指针-(减)指针
5.二级指针
1.指针是什么
指针是内存中最小的单元编号,也就是地址。指针还可以是一种指针变量。
内存:
当我们平时在创造一个变量后,内存会开辟出相应的空间来存放这一数据,例如在创建一个float变量并赋值后,开辟了四个字节来存放,每一个字节都有相应的地址来对应
指针变量:
我们可以通过&(取地址操作符)取出变量的内存其实地址,把地址可以存放到一个变量中,这个变量就是指针变量
2.指针类型
像整型和浮点型都有不同的类型,int,short,float等等,相应的指针也有着不同的类型
如下:
(在定义指针的时候要将其初始化,但如果没有可以指向的变量,一般用NULL空指针表示)
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
对于指针的定义可以看出来为:类型 + *
不同类型的指针来存放不同类型类型变量的地址
char*类型的指针存放char类型变量的地址
int*类型的指针存放int类型变量的地址
以此类推……
2.1指针类型的意义(+-整数)
指针类型的不同除了代之存放变量类型,还可以根据不同类型的字节的不同来进行操作
举例说明:
int类型为‘4’字节数
char类型为‘1’字节数
int main()
{int a = 10;int* pa = &a;char* pc = &a;printf("a=%d\n\n", a);printf("pa=%p\n", pa);printf("pa+1=%p\n\n", pa + 1);printf("pc=%p\n", pc);printf("pc+1=%p\n", pc + 1);return 0;
}
打印结果:
对此,我们可以发现:
同样是+1为什么差别这么大呢?原因就正是在指针类型的不同上,不同字节的指针类型+1所得到的地址是:原地址 + 整数*(sizeof(指针类型))
char*类型一次访问1个字节,+1跳过1个字节
int*类型一次访问4个字节,+1跳过4个字节
可能有人有疑问说:
Q:为什么int类型的变量的地址可以放到char*类型中呢?
A:指针变量都是用来存放地址的,类型的不同只是使得他们的意义不同。
总结:指针的类型决定了指针向前或者向后走一步有多大(距离),这一点在下面解引用也有所体现。
2.2指针的解引用
解引用通俗的来说,就是根据地址去寻找所存储的内容
*pa = a
但在指针变量的声明或定义中并不是解引用,只是创建一个 (int*)类型的指针变量
对于不同的指针类型,对指针解引用的权限也是不同的,这一点跟指针类型的意义中整数的+-有所类似
对比两个例子可以看出,char*类型指针只具有一个字节,所以在解引用后只有一个字节的权限,再次赋值时也只能改变一个字节。如果使用char*类型指针想要将a赋值为0,则要循环语句逐一的将四个字节都赋值为0
而int*类型指针具有四个字节,在解引用后具有四个字节的权限,所以在赋值时可以一次将四个字节都赋值为0。
char* 的指针解引用就只能访问一个字节,而 int* 的指针的解引用就能访问四个字节
在对机器大小端的判别时,就运用到了这个知识点。具体举例在以下文章:
[C语言]和我一起来认识“整型在内存中的存储”_HY_PIGIE的博客-CSDN博客
3.野指针
野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
3.1野指针出现的情况
1.指针未初始化
int* p;
*p = 20;
2.指针越界访问
int arr[10] = {0};
int *p = arr;
for(int i = 0;i <= 10;i++)
{*(p++) = i;//当i=10时超出数组的范围,p就为野指针
}
3.2 如何规避野指针
1. 指针初始化
2. 小心指针越界
3. 指针指向空间释放,及时置NULL
4. 避免返回局部变量的地址
5. 指针使用之前检查有效性
4.指针运算
4.1指针+-整数
int arr[9] = {0};
int* pa = null;
for(pa = &arr[0];pa < &arr[9])
{*pa++ = 0;
}
数组为int类型,取得首元素的地址也即为数组的地址。
获取地址的指针类型为int*(四字节),*运算符的优先级高于++的优先级
所以先是*pa = 1,赋值后再
*pa++,地址+1
因为是int*类型,+1等价于加上四个字节即一个整数位,所以相当跳过一个数组单位
得出:当i++变化时,pa = arr。有:
pa+i =arr[i];
4.2指针-(减)指针
char arr[] = "abcdef";char* pa = arr; //数组首元素的地址while (*pa != '\0'){pa++;当没有遇到字符串结尾的‘\0’,就++}int len = pa - arr;//两个指针相减,得到++的差值,便是字符串的长度printf("%d", len);
5.二级指针
指针变量也是变量,是变量就有地址,那指针变量的地址存放在哪里?这就是 二级指针
像ppa这种取指针地址的指针称为二级指针。
5.1二级指针的运算
本文章目前就到此为止了,如有不对的地方欢迎留言指正。
谢谢观看