指针
定义一个指针变量
变量类型 变量名 初始值
变量类型为int *, 变量名p, 初始值NULL
int-->0 double-->0.0 float -->0.0f char-->'\0' 指针-->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;
指针的移动
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, 2, 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)
语法糖
定义一个字符串
char string[20] = "MobileInternet";
定义一个指针保存字符串的首地址
char *s = string;
printf("%s\n", string);
从b开始打印到字符串结束
printf("%s\n", s + 2);
通过指针修改字符串当中的单个字符
想把Inter的I改成i
s[6] = 'i';
printf("%s\n", string);
s[6] = '\0';
等同与 s[6] = 0;
printf("%s\n", s);
定义一个指针数组
定义数组有几部分?
数组类型 数组名[数组长度] = {初值};
char * strings[3] = {"iPhone", "Android", "Unity3D"};
char * s1 = "iPhone";
s1是字符串的首地址, *s1是字符串的第一个字符
char * s2 = "Android";
char * s3 = "Unity3D";
char * strings[3] = {s1, s2, s3};
遍历一个数组, 需要用循环
for (int i = 0; i < 3; i++) {
printf("%s\n", strings[i]);
}
注意事项
char * s1 = "iPhone";
s1保存的是常量串iPhone的地址
相当于把iPhone第地址拷贝一份赋值到指针变量s1中
char s2[] = "iPhone";
s2是一个栈区的数组
相当于把iPhone这个字符串拷贝了一份存放到s2这个字符数组中
修改s2的'p'字符为'p'
s2[1] = 'p';
printf("%s\n", s2);