文章目录
- 前言
-
文章目录
前言
一、指针运算
1.指针+-整数
2.指针-指针
3.指针关系运算
二、野指针
1.概念
2.野指针的成因
1.未初始化
2.指针越界访问
3.指针指向的空间释放
3.避免野指针
1.指针初始化
2.小心指针越界
3. 指针变量不再使用时,及时置NULL
总结
前言
本篇文章紧接着上篇指针内容,为大家讲解C语言指针的的更多知识内容,让大家更好的了解指针,以及可以熟练使用指针来解决实际问题。
一、指针运算
1.指针+-整数
数组在内存中是连续的
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p= &arr[0]; //&arr[0]==arr
int i = 0;
int j = sizeof(arr)/sizeof(arr[0]);
for(i=0; i<j; i++)
{
printf("%d",*(p+i)); //p+i 这里就是指针+整数
}
return 0;
}
2.指针-指针
指针-指针的运算前提是两个指针指向了同一空间。
int my_strlen(char*)
{
char* pl = p;
while(*p != '\0')
{
p++;
}
return p-pl; //指针-指针
}
int main()
{
char arr[]= "abcdef"://数组名其实是数组首元素的地址 arr == &arr[0]
int len = my_strlen(arr);
printf("%d\n",len);
return 0;
}
3.指针关系运算
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p= &arr[0];
int i = 0;
int j = sizeof(arr)/sizeof(arr[0]);
while(p<arr+j) //指针大小比较
{
printf("%d",*p);
}
return 0;
}
二、野指针
1.概念
野指针:指针指向的位置是不可知的(随机,不正确,没有明确限制的)
2.野指针的成因
1.未初始化
int main()
{
int* p; //局部变量:局部变量不初始化时,它的值是随机值
*p = 20;
printf("%d\n",*p);
return 0;
}
2.指针越界访问
#include <stdio.h>
int main()
{
int arr[10]={0};
int *p = &arr[0];
int i = 0;
for(i=0; i<=11; i++)
{
*(p++)= i;
} // 当指针指向的范围超出数组arr的范围时,p就是野指针
return 0;
}
3.指针指向的空间释放
#include<stdio.h>
int* no()
{
int n=10;
return &n;
}
int main()
{
int*p = no();
printf("%d\n”,*p);
return 0;
}
3.避免野指针
1.指针初始化
如果明确知道指针指向哪里就直接赋值地址,如果不知道指针应该指向哪里,可以使用NULL给指针赋值。NULL 是C语言中定义的一个标识符常量,值是0,0也是地址,这个地址是无法使用的,读写该地址会报错。
#include <stdio.h>
int main()
{
int i = 10;
int*pl = &i;
int*p2 = NULL;
return 0;
}
2.小心指针越界
一个程序向内存申请了哪些空间,通过指针也就只能访问哪些空间,不能超出范围访问,超出了就是越界访问。
3. 指针变量不再使用时,及时置NULL
指针使用之前检查有效性当指针变量指向一块区域的时候,我们可以通过指针访问该区域,后期不再使用这个指针访问空间的时候,我们可以把该指针置为NULL,因为约定俗成的一个规则就是:只要是NULL指针就不去访问,同时使用指针之前可以判断指针是否为NULL。
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
int *p= &arr[0];
for(i=0;i<10; i++)
{
*(p++)= i ;
} //此时p已经越界了,可以把p置为NULL
P= NULL; //下次使用的时候,判断p不为ULL的时候再使用
p=&arr[0]; //重新让p获得地址
if(p != NULL) //判断
{
}
return 0;
}
总结
以上内容为对上篇指针进行了补充和完善,为大家讲解了C语言指针的具体操作和一些注意事项,感谢各位的耐心观看,如果以上内容对大家学习有所帮助的话,希望大家可以点赞支持一下!