#include<stdio.h>
int main(void){
//一,指针
//指针实际上也是变量的一种,和普通的变量一样,所以也叫指针变量。
int a = 1;
//定义一个指针变量
int *p;
//%p是打印地址
//%x是以十六进制形式打印
printf("1 p = %p.\n",p);
printf("2 p = %x.\n",p);
//p指向a的地址
p = &a;
printf("3 p = %d.\n",p);//打印a的地址
printf("4 p = %d.\n",*p);//打印a的地址
printf("5 a = %d.\n",&a);//打印a的地址
printf("6 a = %d.\n",a);//打印a的值
//p指向内存地址为6的那个变量
p = (int*)6;
printf("7 p = %d.\n",p);
//二 野指针问题
//野指针是指指向随机内存的指针,所以所指向的值可能是随机的。
//怎么避免野指针
//1:定义指针时,同时初始化为NULL
//2: 在指针解引用之前,先去判断这个指针是不是NULL
//3: 指针使用完之后,将其赋值为NULL
//4: 在指针使用之前,将其赋值绑定给一个可用地址空间
int a_2 = 2;
int *p_2 = NULL;
if(p_2 == NULL){
p_2 = &a;
}
p_2 == NULL;
//三 const关键字
//在C语言中用来修饰变量,表示这个变量是常量。
const int a_3 = 3;
const int *P_3_1;
int const *P_3_2;
int * const P_3_3;
const int * const P_3_4;
//这一行报错,*P_3_1是只读的,表明指针P_3_1指向的值是常量
//*P_3_1 = 3;
//正常,表明指针P_3_1不是常量
P_3_1 = &a_3;
//这一行报错,*P_3_2是只读的,表明指针P_3_2指向的值是常量
//*P_3_2 = 3;
//正常,表明指针P_3_2不是常量
P_3_2 = &a_3;
//这一行正常,*P_3_3是可写的
*P_3_3 = 3;
//这一行报错,P_3_3是只读的,表明指针P_3_3是常量
//P_3_3 = &a_3;
//这一行报错,*P_3_4是只读的,表明指针P_3_4指向的值是常量
*P_3_4 = 3;
//这一行报错,P_3_4是只读的,表明指针P_3_4是常量
//P_3_4 = &a_3;
//四 数组
//数组中的地址都是连续的,所以用地址操作起来很方便.
//数组的地址是常量,是编译器确定的地址,所以数组的地址不可以重新赋值。
//五 指针与强制类型转换
// 数据类型的本质就是,决定数据在内存是如何存储的。
//指针类型就是指,这个指针指向的是一个怎样的数据结构。
//p_5指向的是一个int型的数据结构
int *p_5
return 0;
}