指针1
什么是指针?
1、指针就是变量,用来存放地址的变量。指针大小在32位平台上是4个字节,在64位平台上是8位字节。
#include <stdio.h>
int main()
{
int a=10;//在内存中开辟一块空间
int * p=&a;//取出a的地址,存在p中,p就是一个指针变量。
return 0;
}
指针和指针类型
指针类型的大小都是4个字节,那么指针类型有什么意义呢?
1、指针类型决定了,指针解引用的权限有多大。例如int类型可以访问4个字节,char类型可以访问1个字节。
2、指针类型决定了,指针走一步,步长是多大。例如int类型走一步加4;char类型走一步加1。
野指针
什么是野指针?野指针就是指针指向的位置不可知的指针。
成因
1、指针没有初始化。
#include <stdio.h>
int main()
{
int* p;//局部变量未初始化,存放随机值
*p=20;//非法访问内存
return 0;
}
2、指针越界访问。
#include <stdio.h>
int main()
{
int arr[10]={0};
int* p=arr;
for(int i=0; i<=10; i++)
{
*p=i;
p++;
}
return 0;
}
3、指针指向的空间释放。
如何避免野指针
1、指针初始化。
2、小心指针越界。
3、指针指向的空间释放后,即使指向NULL。
4、指针使用之前检查指针有效性。例如判断指针是否是空指针,不是在使用,否则不使用。
指针运算
指针+-整数。
指针的关系运算(+、-)。
#define N_VALUES 5
int mian()
{
float values[N_VALUES];
float *VP;
for(VP=&values[0]; VP<&values[N_VALUES])
{
*VP++=0;
}
}
指针-指针。
#include <stdio.h>
int main()
{
int arr[10]={1,2,3,4,5,6,7,8,9,10};
printf("%d",&arr[9]-&arr[0]);
return 0;
}
上面代码的结果是9,指针-指针得到的是两个指针之间的元素个数。所以指针和指针相减时,两个指针必须指向同一个空间。 用指针-指针模拟string函数。
int my_strlen(char *s)
{
char *p=s;
while(*p!='\0')
p++;
return p-s;
}