指针变量的定义和使用
指针:数据在内存中的地址。
指针变量:存储内存地址的变量。
定义指针变量
定义指针变量和普通变量定义类似,需在变量名前面加星号*
,格式为:
datatype *name;
datatype *name = value;
注意:
*
表示这是一个指针变量,datatype
表示 该指针变量 所指向的数据的类型。
任意指针类型大小:
指针的大小与类型 无关,只与当前使用的平台架构有关。
32位:4字节;
64位:8字节
野指针
1)没有一个有效地址空间的指针。
int *p;
*p = 1000;
2) p变量有一个值,但该值不是可访问的内存区域。
int *p = 10;
*p = 1000;
【杜绝野指针】
空指针
int *p = NULL;
// *p 时 p所对应的存储空间一定是一个 无效的访问区域
万能指针/泛型指针(void *)
可以接收任意一种变量地址。但在使用必须借助强转具体化数据类型。
int a = 32, b;
void *p; // 万能指针。若要使用,需要将其类型具体化
p = &a;
b = *((int *)p);
const
const修饰变量:
const int a = 20;
//a = 30; //不能修改
int *p = &a;
*p = 650; //------> a = 650
const修饰指针:
const int* p; //可以修改p变量的值, 不可以修改*p
int const *p; //同上。可以修改p变量的值,不可以修改*p
int* const p; //可以修改*p的值,不可以修改p变量的值
const int* const p; //既不可以修改p,也不可以修改*p
总结:const向右修饰,被修饰的部分即为只读。
常用:在函数形参内,用来限制指针所对应的内存空间为只读。
指针和数组
数组名:
【数组名是地址“常量”】----> 不可以被赋值
指针是变量,可以用数组名给指针变量赋值。
取数组元素:
int arr[] = {1, 2, 3};
int *p = arr;
arr[0] == *(arr+0) == p[0] == *(p+0)
指针和数组的区别:
1. 指针是变量,数组名为常量。
2. sizeof(指针) ===>> 4/8
3. sizeof(数组) ===>> 数组的实际字节数