指针类型决定了指针进行解引用操作的时候,能够访问空间的大小。
指针的类型决定了指针向前或向后走一步有多大(距离)
野指针:
野指针就是指针指向的位置是不可知的(随机的 不正确的 没有明确限制的)
1.指针未初始化
int *p;//局部变量指针未初始化,默认随机值
*p=20;
2.指针越界访问
int arr[10]={0};
int* p=arr;
int i=0;
for(i=0;i<12;i++);
{
*(p++)=i;//当指针指向范围超出数组arr的范围时,p就是野指针
}
3.指针指向内存的空间释放
int* test()
{
int a=20;//a是局部变量,出了test函数的范围,就会释放
return &a;
}
int main()
{
int* p=test()
*p=20;
return 0;
}
如何规避野指针:
1.指针初始化
2.小心指针越界
3.指针指向空间释放即放置NULL
4.指针使用前检查有效性
指针的运算
1.指针+或-整数
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (i = 0; i < sz; i++)
{
printf("%d\n", *(p + i));
}
2.指针-指针
int arr[10] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int i = 0;
int sz = sizeof(arr) / sizeof(arr[0]);
int* p = arr;
for (i = 0; i < sz; i++)
{
printf("%d\n", (p + i)-p);
}
3.指针的关系运算
指针数组是数组,用来存放指针
#include <stdio.h>
int main()
{
int arr1[] = { 1,2,3,4 };
int arr2[] = { 2,3,4,5 };
int arr3[] = { 3,4,5,6 };
int* parr[] = { arr1,arr2,arr3 };
int i = 0;
int j = 0;
for (i = 0; i < 3; i++)
{
for (j = 0; j < 4; j++)
{
printf("%d ", *(parr[i] + j));
}
printf("\n");
}
return 0;
}
数组指针,它是指针
int arr[10];------------arr是一个5个元素的整型数组
int* parr1[10];---------parr1是一个数组,数组有10个元素,每个元素类型为int*,parr1是指针数组
int (*parr2)[10];--------parr2是一个指针,该指针指向一个数组,数组有10个元素,每个元素类型为int,parr2是数组指针。
int (*parr3[10])[5];----parr3是一个数组指针,该数组有10个元素,每个元素是一个数组指针,该数组指针指向的数组有5个元素,每个元素是int类型
函数指针---指向函数的指针
&函数名和函数名 都是函数的地址
回调函数
他就是一个通过函数指针调用的函数。
标签:10,arr,int,元素,数组,指针 From: https://blog.51cto.com/u_15839001/6443560