指针
指针是什么
在计算机科学中,指针是编程语言中的一个对象,利用地址,它的值直接指向存在电脑存储器中另一个地方的值。可以说,地址指向该变量单元。指针就是一个变量,存放内存单元的地址(编号)
对应到代码
int main()
{
int a = 10; //在内存中开辟一块空间
int* p = &a; //对变量a用&操作符取出它的地址,将a的地址存放在变量p中,p就是一个指针变量
}
指针的大小在32位平台上就是4个字节,在64位平台上就是8个字节
指针的定义方式:
type+*
指针和指针类型
我们都知道变量有不同的类型,整型、浮点型等,那指针有没有类型呢?准确的说:有
指针类型的意义:
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);
}
通过上例我们可以看出,指针的类型决定了指针向前或向后走一步有多大(距离)
指针的类型决定了,对指针解引用的时候有多大的权限(能操作几个字符)。比如:char的指针引用就只能访问一个字节,而int的指针解引用就能访问4个字节
野指针
概念:指针指向的位置是不可知的(随机的、没有明确限制的)
野指针成因:
- 指针未初始化
int* p;//此时的p就是野指针
- 指针越界访问
int mian()
{
int arr[6] = { 0 };
int* p = arr;
int i = 0;
for (i = 0; i < =7; i++)
{
*(p++) = i;
//当指针指向的范围超出数组arr的范围时,p就是野指针
}
}
如何规避野指针:
- 指针初始化
- 小心指针越界
- 指针指向空间释放即设置NULL
- 指针使用之前先检查有效性
指针数组
指针数组是数组还是指针?答案是数组,是存放指针的数组
int* arr[3]; //arr是一个数组,有3个元素,每个元素是一个整形指针
指针与数组
在上篇文章中,也提到数组名就是首元素的地址,也举例说明
那么既然可以把数组名当成地址存放到一个指针中,而且数组在内存中是连续存放的,我们就可以用指针来访问数组。
void Init(int* arr, int sz)//数组作为实参,可以用指针接收
{
int i = 0;
for (i = 0; i < sz; i++)
{
arr[i] = i;
}
}
int main()
{
int arr[10] = { 0 };
int sz = sizeof(arr)/sizeof(arr[0]);
int i = 0;
Init(arr,sz);
for (i = 0; i < sz; i++)
{
printf("%d ",arr[i]);
}
return 0;
}