指针
概念:内存有编号叫做内存的地址,内存以字节为单位
定义指针变量形式
变量类型 变量名 初始值(int * p NULL)
指针的定义方式有三种
1.int* p = NULL;
2.int *p = NULL;
3.int * p = NULL;
分清类型和变量名
指针变量所占内存大小只与系统有关
// 测试指针变量所占空间大小
printf("%lu\n", sizeof(int *));
// printf("%lu\n", sizeof(char *));
打印地址的转义字符用%lu指针变量的赋值
通过指针变量所存地址来访问数据
char *p = NULL;
NULL 空 恒等于0的意思
一个新的操作符*
*取值操作符(根据内存地址取内容或者取数据)
&取址操作符与*相反的操作符可以抵消掉
*p = *&a = a
指针的移动p+1或者p-1
1.不同类型的指针变量决定指针每次移动的字节数
2.决定从类型当中取多少个字节的数据
常量不可改
int *p = NULL;
*p = 5;
这两句连在一起的时候是错误的程序,因为p所指向的内存是常量, 常量存储在常量区,常量区的值是不可更改的
数组的本质
一段连续的内存
数组名:数组的首地址
array 恒等于&array【0】
// array[2] ----- p[2] -- *(array + 2) -- *(p + 2)
// // 语法糖
// printf("array[2] = %d\n", array[2]);
// printf("p[2] = %d\n", p[2]);
// printf("*(array + 2) = %d\n", *(array + 2));
// printf("*(p + 2) = %d\n", *(p + 2));
定义一个指针数组 数组类型 数组名【数组长度】 = {初值};
// 遍历一个数组
// for (int i = 0; i < 3; i ++) {
// printf("%s\n", string[i]);
// }
char *s1 = "iPhone";
// s1保存的是常量串iphone的首地址
//相当于把iPhone的地址拷贝一份赋值到指针变量s1中
// 注意事项
char s2[] = "iPhone";
// s2是一个栈区的数组
// 修改s2的‘p’为‘P’
s2[1] = 'p';
printf("%s\n", s2);
// 把s1 的‘P’改为‘p’
//相当于把iphone这个字符串拷贝一份存放都s2这个数组当中
s1[1] = 'p';//该条语句不可行,不能试图改变常量区的数据