前言
c语言基本数据类型没什么说的, 看看指针
一、功能理解
- 如果把内存地址看做一条很长的卡尺,指针就是上面的游标,我们对其的操作就是左右滑动
- 指针变量存储的就是地址值,获取地址值后我们可以对其指向的变量的数据进行修改
char byte[] = "12345";
char *p_byte = byte;
printf("%p\n%p\n", p_byte, byte);
*(p_byte + 4) = '\0';
printf("%s\n", p_byte);
- 输出:
000000443591F810
000000443591F810
1234
二、字节大小
- 指针类型变量占用 8 个字节
三、使用要点
1.作用域
-
- 作用域就是指游标滑动一次的最小步长
指向的类型所占字节大小 就是它的最小步长大小 short* point=NULL, 指针point 最小步长即为 2 字节
- 作用域就是指游标滑动一次的最小步长
-
上面代码 p_byte + 4 步长就是 sizeof(char) x 4 即指针移动4个字节,到了字符’5’所在的地址
-
如果p_byte是整型指针 就是 sizeof(int) x 4 移动16个字节
-
如果有需要可以强转为其他指针类型以改变作用域
2.解析 *
- 使用 * 解析指针 得到指针指向的 (“容器”||左值||变量)
- 解析时是依据其作用域来解析 试用short型指针指向 包含0x12345678的int 变量 再用%x输出
四、指针与数组
- 上面p_byte指针可以这样使用p_byte[2]
- 于是我们理解了 [ ] 运算符, byte[2] 等同于 (*(byte+2))
- 试比较 sizeof(数组变量) 与 sizeof(指针) 数组与指针并不完全相同
五、数组指针
- 指向数组的指针
short threarray[4][3][2] = {{{1, 9}, {2, 1}, {1, 1}}, {{3, 1}, {1, 1}, {1, 1}}, {{4, 1}, {1, 1}, {1, 1}}, {{0, 0}, {0, 0}, {0, 0}}};
short(*p)[3][2] = threarray;
printf("%d\n", ***(p + 1));
- p+1 移动1 x 3 x 2 x sizeof(short) 个字节 所以打印出 3
- 用 * 降维, 如果要打印 2 维的第 2 个组的第一个元素 p[0][1][0] 或 **(*p + 1)
六、函数指针
-
指向函数的指针,函数指针是一个特殊的指针
一般定义形式:返回类型 (*指针变量名)();
指向->函数 :
指针变量名 = 函数名;
调用形式:
(*指针变量名)(函数参数);