1.指针是什么 ?
在C语言中,指针是一种变量,用于存储另一个变量的内存地址。通过指针,可以直接访问和操作内存中的数据。
(1)指针的声明 :
int *ptr;
(2)取地址运算符(&):
int a = 10;
int *ptr = &a;
&a
获取变量 a
的内存地址,并将其赋值给指针 ptr
。
(3)解引用运算符(*):
int b = *ptr;
*ptr
获取 ptr
所指向地址的值,这里 b
将被赋值为 10
。
2.指针的类型:
(1)指针的类型决定了它所指向的数据类型以及指针运算的行为。指针的类型不仅影响解引用时的操作,还影响指针的算术运算(如加减操作)。在此之前,我们已经学习了C语言的内置数据类型,比如int、float、double等,当然指针也是如此。
char *pc = NULL;
int *pi = NULL;
short *ps = NULL;
long *pl = NULL;
float *pf = NULL;
double *pd = NULL
(2)指针类型的作用:
-
解引用时的操作:
指针的类型决定了如何解释指针所指向的内存中的数据。例如:-
int*
指针解引用时,会从内存中读取一个int
类型的数据。 -
char*
指针解引用时,会从内存中读取一个char
类型的数据。
-
-
指针算术运算:
指针的加减操作会根据指针的类型进行调整。例如:-
int*
指针加 1 时,实际地址会增加sizeof(int)
。 -
char*
指针加 1 时,实际地址会增加sizeof(char)
。
-
(3)指针的大小:
在大多数系统中,指针的大小是固定的,与它指向的数据类型无关。例如:
-
在 32 位系统中,指针通常是 4 字节。
-
在 64 位系统中,指针通常是 8 字节。
3.野指针:
(1) 野指针(Dangling Pointer) 是指向无效内存地址的指针。使用野指针会导致未定义行为,通常会导致程序崩溃或数据损坏。野指针的产生通常是由于指针所指向的内存已经被释放或失效,但指针仍然保留了原来的地址值。
(2)野指针的成因:
1. 指针未初始化
#include <stdio.h>
int main()
{
int* ptr;
*ptr = 20;
return 0;
}
2. 指针越界访问
#include <stdio.h>
int main()
{
int arr[10] = { 0 };
int* ptr = arr;
int i = 0;
for (i = 0; i <= 11; i++)
{
*(ptr++) = i;
}
return 0;
}
如图当指针指向的范围超出数组arr的范围时,p就是野指针。