// 定义一个指针变量
// 变量类型 变量名 初始值
// 变量类型int *,变量名p,初始值NULL
// int *p = NULL;
// 指针的定义方式可以有三种
// int* p = NULL;
// int *p = NULL;
// int * p = NULL;
// 测试指针变量所占空间的大小
// 整型指针所占空间的大小
// printf("%lu\n", sizeof(int *));
// // 测试字符型的指针变量所占的大小
// printf("%lu\n", sizeof(char *));
// // 打印指针所存放的地址
// int *p = NULL;
// printf("p = %p\n", p);
// int a = 3;
// printf("a = %p\n", &a);
// // 指针变量的赋值
// p = &a;
// printf("p = %p\n", p);
// int b = 5;
// printf("b = %p\n", &b);
// p = &b;
// printf("p = %p\n", p);
// // pointer
// // 通过指针变量所存的地址来访问数据
// int *p = NULL;
// int a = 3;
// p = &a;
// // 一个新的操作符 *
// // * 取值操作符(根据内存地址取内存);
// // & 取值操作符
// // 通过p找到内存地址,再使用*操作来修改内存当中的数据
//
// *p = 5; // 可以近似的理解为*p = a(前提是p不能重新赋值)
// printf("a = %d\n", a);
// p = &a;
// *p = *&a = a
// 指针的移动
// char c = 'A';
// char *q = &c;
// printf("p = %p\n", q);
// printf("p- = %p\n", q-1);
// printf("p+ = %p\n",q + 1);
// 不同类型的指针变量决定指针每次移动的字节数
// 决定从内存中取多少个字节的数据
//
// int d = 30000;
// // 用一个char类型的指针保存a的地址
// char *t = &d;
// // 通过操作符来取内存中的数据
// printf("%d\n", *t);
// 相同的操作在不同的地址,得到的结果会大不相同
// int *p = NULL;
// *p = 5;
// // 数组的本质是一段连续的内存
// // 数组名:数组的首地址(首元素的首地址)常量地址
// // array 恒等于&array[0]
// int array[5] = {3, 83, 5, 6, 7};
// // 定义一个指针变量用来保存首地址
// int *p = array;
// // *p是什么---->相当于是array[0]
// printf("*p = %d\n", *p);
// // 那么*(p + 1)是什么
// // p + 1相当于是array[1]
// // *(p + 1)->*&array[1]->array[1]
// printf("*(p + 1) = %d\n", *(p + 1));
// // *p + 1是什么
// // *p->array[0]
// //array[0] + 1
// printf("*p + 1 = %d\n", *p + 1);
//
//
// // array[2] -->p[2]--->*(array + 2)---*(p + 2)
// // 语法糖
// printf("array[2] = %d\np[2] = %d \n*(array + 2) = %d \n*(p + 2) = %d\n",array[2], p[2], *(array + 2), *(p + 2));
// // 定义一个字符串
// char string[20] = "MobileInternet";
// // 定义一个指针保存字符串的首地址
// char *s = string;
// // 从b开始打印到字符串结束
// printf("%s\n",s + 2);
// printf("%s\n",s + 5);
// printf("%s\n", s);
// // 通过指针修改字符串当中的单个字符
// // 想把Inter的I改为i
// s[6] = 'i';
// printf("%s\n", s);
// // 通过指针修改字符
// s[6] = '\0';// '\0' = 0;
// printf("%s\n", s);
// 定义一个指针数组
// 定义数组有几部分
// 数组类型 数组名[数组长度] = {初值};
char * string[3] = {"iPhone", "Android", "Unity3D"};
// char *s1 = "iPhone";
// // s1是字符串的首地址 *s1是字符串的第一个字符
// printf("%s\n", s1);
// char *s2 = "Android";
// char *s3 = "Unity3D";
// char *string[3] = {s1, s2, s3};
// // 遍历一个数组,需要用循环
// for (int i = 0; i < 3; i++) {
// printf("%s\n", string[i]);
// }
//
// 注意事项
char *s1 = "iPhone";
// 相当于把iPhone的地址拷贝了一份赋值到指针变量s1中
char s2[] = "iPhone";
// 相当于把iPhone这个字符串拷贝了一份存放到s2这个字符数组中
// 修改s2的‘P’为字符'p';
s2[1] = 'p';
// s2是一个栈区
printf("%s\n", s2);
s1[1] = 'p';
// s1保存的是常量串,不能进行重新修改