指针
定义一个指针变量
变量类型 变量名 初始值
变量类型为int * , 变量名p, 初始值NULL(空 也可以写成0);
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\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);
通过指针变量所存地址来访问数据
int *p = NULL;
int a = 3; p = &a;
一个新的操作符 *
* 取值操作符(根据内存地址取内容或者取数据)
& 取址操作符
通过p找到内存地址, 在使用*操作来修改内存中的数据
*p = 5;
可以近似的理解为*p 恒等于a(前提条件, p不重新赋值)
p = &a *p = *&a = a;
printf("a = %d\n",a);
指针的移动
printf("p = %p\n", p);
printf("p- = %p\n", p - 1);
printf("p+ = %p\n", p + 1);
不同类型的指针变量,决定指针每次移动的字节数
不同类型直接变量,决定从内存当中取多少个字节数据
int a = 30000;
用一个char类型的指针保存a 的地址
char *p = &a;
通过操作符来取内存当中的数据
printf("%d\n", *p);
相同的操作在不同的地址, 得到的结果会大不相同
int *p =NULL;
*p = 5;
数组的本质是一段连续的内存
数组名; 数组的首地址(首元素的首地址) 常量地址
array 恒等于&array[0]
int array[5] = {3, 4, 2, 9, 7};
定义一个指针变量 用来保存数组的首地址
int *p = array;
思考*p是什么? -->相当于是array[0]
printf("*p = %d",*p);
那么*(p + 1)是什么? 相当于-->*&array[1]-->array[1]
P + 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) 可以相互替换 结果一样
语法糖
%s是从首地址一直打印到\0;
定义一个字符串数组
char string[20] = "MobileInternet";
定义一个指针保存字符串的首地址
char *s = string;
printf("%s\n", s);
从B开始打印到字符串结束
printf("%s\n", s + 2);
通过指针修改字符串当中的单个字符
把Inter的I该成i
s[6] = 'i';
printf("%s\n", s);
通过指针修改字符
s[6] = '\0';
等同与s[6] = 0;
printf("%s\n", s);