大家好,我是想要慢慢变得优秀的向阳同学,从今天开始逐渐恢复更新状态,想学习计算机知识的小伙伴可以支持一下哦!~不能说肯定是干货,但会让你有所收获!
快乐地生活在这个世界上,你不需要取悦于任何人,做最好的自己。
目录
指针类型
案例1:
案例二:
指针和数组
野指针
野指针出现的原因
️️1.指针未初始化️️
2.指针越界访问
如何避免野指针问题
指针运算
指针+- 整数
指针-指针
指针的关系运算
二级指针
- 如果你想从头开始认识或者复习指针,可以看一下我之前写的文章
- 【最受欢迎最容易理解的初阶c语言教学】5.指针和结构体_想要慢慢变得优秀的向阳的博客-CSDN博客
指针作为储存变量地址的变量,也是具有类型的。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL;
那么这些指针变量的类型有什么意义呢?
指针的类型决定了指针向前或者向后走一步有多大(距离) 指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字节)
先给出结论,再让我们看看接下来的案例
#include
int main()
{
int n = 10;
char* pc = (char*)&n;
int* pi = &n;
printf("%p\n", &n);
printf("%p\n", pc);
printf("%p\n", pc + 1);
printf("%p\n", pi);
printf("%p\n", pi + 1);
return 0;
}
- char*类型的指针经过整数加减,改变1个字节
- int* 类型的指针经过整数加减,改变4个字节
#include
int main()
{
int n = 0x11223344;
int m = 0x11223344;
char* pc = (char*)&n;
int* pi = &m;
*pc = 0;
*pi = 0;
return 0;
}
- char*类型的指针经过解引用,操作了1个字节
- int* 类型的指针经过解引用,操作了4个字节
- 这个内容细讲起来比较多,可以看下面的链接文章
- 【指针和数组名】一篇文章搞懂它们之间的暧昧关系_想要慢慢变得优秀的向阳的博客-CSDN博客
- 概念: 野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
#include
int main()
{
int *p;//局部变量指针未初始化,默认为随机值
*p = 20;
return 0; }
#include
int main()
{
int arr[10] = {0};
int *p = arr;
int i = 0;
for(i=0; i<=11; i++)
{
//当指针指向的范围超出数组arr的范围时,p就是野指针
*(p++) = i;
}
return 0; }
- 在使用指针前,要做到一下三个步骤即可。
#include
int main()
{
int* p = NULL;//初始化时不知道指向哪的时候或者使用完后要赋值为NULL
if ( p!= NULL)//经过之前的赋值,下次代码写的多,哪怕忘了是否为野指针
//用一下判断再解引用指针
{
*p = 20;
}
return 0;
}
#include
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
int* p = arr;
for (int i = 0; i < 10; i++)
{
printf("%d ", *(p + i));
}
return 0;
}
int my_strlen(char *s) {
char *p = s;
while(*p != '\0' )
p++;
return p-s; }
- 前提是两个指针必须指向一块地址
int main()
{
int arr[10] = { 1,2,3,4,5,6,7,8,9,10 };
for (int *i = arr; i < &arr[10]; i++)
{
printf("%d ", *i);
}
return 0;
}
- 关系运算就是说,两个指针可以比较大小做判断
- 概念:指针变量也是变量,是变量就有地址,那指针变量的地址存放的地方就是二级指针
int main()
{
int a = 10;
int* p = &a;
int** pp = &p;
printf("%d\n", a);
printf("%d\n", *p);
printf("%d\n", * *pp);
return 0;
}