内存
变量在内存中储存,可以通过变量名来获取,也可以通过变量地址值来获取
指针是一种数据类型
无论是什么类型的指针,存的都是地址,内存地址都是无符号整型的,所以都是4个字节大小
格式:
数据类型 * 指针名
int a=10;
int* p=&a;
p是指针类型变量 用来指向一个变量的地址
变量的地址值通过&(地址符)获取
通过指针修改变量的值
*p代表值
指针前面加*代表取这个指针的值
int a=10;
int* p=&a;
*p=20;
p代表地址值
sizeof()指针在内存中的大小
32位系统中,所有指针地址都是4个字节
64位系统中,所有的指针地址都是8个字节大小
内存编号0-255都是系统保留的,不能读,不能写
野指针、空指针、万能指针
野指针
野指针是指向一个未知的内存空间 可能在读写的时候出现错误
空指针
空指针是指向内存编号为0的空间,操作该内存空间会报错,一般情况NULL用作于程序条件判断
万能指针
int a=10;
void* p=&a;
*(int*)p=20;
万能指针赋值要先强转到对应的类型
修饰指针
通过const修饰
const修饰的变量可以通过1级指针地址值修改一个常量的值,不能直接改值。
const int a=10
a=30;(错误)
如果const修饰指针数据类型(int *) 类型,可以改变指针指向的地址
int a=10;
int b;
const int* p=&b;
*p=20;(错误)
p=&a;(可以)
const修饰指针变量,可以改变指针变量指向的内存地址的值
int * const p=&a;
const修饰指针变量和指针数据类型,都不可以通过一级指针修改,可以通过二级指针修改
const int *const p=&a;
//**就是二级指针
(int**pp=&p
**PP=20;)
指针与数组
数组名是数组的首地址,这是一个常量
通过指针操作数组
例1:
int arr[] = { 1,2,3,4,5,6,7,8,9 };
int* p = arr;
for (int i = 0; i < 9; ++i)
{
printf("%d ", p[i]);
}
例2:
printf("\n");
for (int i = 0; i < 9; ++i)
{
printf("%d ", *(p+i));
}