指针
什么是指针?
在计算机科学中,指针(pointer)是编程语言中的一个对象,利用地址,它的值直接指向存在电脑储存器中另一个地方的值。由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元。因此,将地址形象化的称为“指针”。意思是通过它能找到以它为地址的内存单元。
指针:
指针是个变量,存放内存单元的地址
总结:指针就是变量,用来存放地址的变量。(存放在指针中的值都被当成地址处理)
指针类型的意义
指针有多种类型,int 型,char 型, float 型,double 型
指针类型决定了,指针再解引用操作的时候,能够访问空间的大小
int *p,*p能够访问 4 个字节。
char * p,*p能够访问 1 个字节。
double *p,*p能够访问 8 个字节。
如果,指针 ±整数,指针的类型就决定了指针向前或向后走的距离(int 类型的指针+1等于 char 类型+4)
野指针
概念:野指针就是指针指向的位置是不可知的(随机的、不正确的、没有明确限制的)
野指针成因:
- 指针未初始化
- 指针越界访问
- 指针指向的空间被释放
如何避免野指针
4. 指针初始化
如果实在不知道指针该如何赋值,可以赋予NULL 空指针
- 小心指针越界
- 指针指向空间释放时,及时置NULL
- 指针使用前检查有效性
指针运算:
1.指针±整数
例:利用指针访问数组
void main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int i = 0;
int *p = a;
for (i = 0; i < 5; i++)
{
printf("%d ", *p);
p++;
}
}
结果如下:
2.指针-指针
在数组中,指针与指针相减,得到的绝对值为两个指针间元素的个数。
如:
#include<stdio.h>
void main()
{
int a[5] = { 1, 2, 3, 4, 5 };
int i = 0;
int *p1 = &a[0],*p2=&a[4];
printf("%d\n ", *p2-*p1);
}
结果如下:
例:利用指针模拟 strlen 函数:
#include<stdio.h>
int my_strlen(char *str)
{
char * start = str;
char * end = str;
while (*end != '\0')
{
end++;
}
return end - start;
}
void main()
{
char a[] = "i love you";
int len = my_strlen(a);
printf("%d\n", len);
}
结果如下:
3.指针的关系运算
指针与数组
正常情况下,仅有一个 数组名 表示的都是数组首元素的地址。但是有两种情况例外
1.&数组名 – 数组名不是首元素的地址,而是整个数组的地址,&数组名 表示取出整个数组的地址
2.sizeof( 数组名)-- 数组名表示的也是整个数组的地址,sizeof(数组名)表示的是计算整个数组的大小
既然数组名表示首元素的地址,那么通过指针访问数组就成为了可能
#include<stdio.h>
void main()
{
int arr[5] = { 1, 2, 3, 4, 5 };
int *p = arr;
int i;
for (i = 0; i < 5; i++)
printf("%d ", arr[i]);
printf("\n");
for (i = 0; i < 5; i++)
printf("%d ", *(p + i));
printf("\n");
}
结果如下:
可以看到,利用数组和指针访问的结果相同