Summary
1)指针的本质是变量
,特殊在于存储的内容是一段内存地址
。
2)在指针声明时
,*号
表示所声明的变量为指针
;在指针使用时
,*号
表示取指针所指向的内存空间中的值
【【C进阶】26、指针的本质分析】3)指针作为函数参数:
- 指针是变量,因此可以声明
指针参数
- 当一个函数体内部需要
改变实参的值
- 则需要使用指针参数;函数调用时
实参值将复制到形参
- 指针适用于
复杂数据类型作为参数
的函数中
左数右指
-- 当const
出现在*号左侧
时,指向的数据为常量
;当const
出现在*号右侧
时,指针为常量
。const int* p;
// 指针p可变,指向的数据*p不可变
int const* p;
// 指针p可变,指向的数据*p不可变
int* const p;
// 指针p不可变,指向的数据*p可变
const int* const p;
// 指针p不可变,指向的数据*p也不可变
指针的本质分析 问题:程序中的
变量
只是一段存储空间的别名
,那么是不是必须通过这个别名才能使用这段存储空间?1、指针的声明和使用 下面的程序输出什么?为什么
int i = 5;
int* p = &i;
printf("%d, %p\n", i, p);
// 5, 0XBFDB216C*p = 10;
printf("%d, %p\n", i, p);
// 10, 0XBFDB216C
- 在指针
声明时
,*号
表示所声明的变量为指针
- 在指针
使用时
,*号
表示取指针所指向的内存空间中的值
文章图片
- 指针是变量,因此可以声明
指针参数
- 当一个函数体内部需要
改变实参的值
,则需要使用指针参数 - 函数调用时
实参值将复制到形参
- 指针适用于
复杂数据类型作为参数
的函数中
// 指针作为参数分析 void swap1(int a, int b) { int t = a; a = b; b = a; }void swap2(int* pa, int* pb) { int t = *pa; *pa = *pb; *pb = t; }int main() { int a = 1, b = 2; swap1(a, b); // 将实参a和b的值,赋值给swap1参数a、b,函数内部实际修改的是函数的形参a和b,不会影响实参 printf("%d, %d\n", a, b); // 1, 2swap2(&a, &b); // 将实参a和b的地址,赋值给参数指针pa和pb,函数内部使用*号打开了这两个地址,并修改了里面的值,所以外面的实参也会变 printf("%d, %d\n", a, b); // 2, 1 return 0; }
左数右指
-- 当const
出现在*号左侧
时,指向的数据为常量
;当const
出现在*号右侧
时,指针为常量
。const int* p;
// 指针p可变,指向的数据*p不可变
int const* p;
// 指针p可变,指向的数据*p不可变
int* const p;
// 指针p不可变,指向的数据*p可变
const int* const p;
// 指针p不可变,指向的数据*p也不可变
本文总结自“狄泰软件学院”唐佐林老师《C语言进阶课程》。
如有错漏之处,恳请指正。
推荐阅读
- c/c++|有感 Visual Studio 2015 RTM 简介 - 八年后回归 Dot Net,终于迎来了 Mvc 时代,盼走了 Web 窗体时代...
- C/C++|C/C++ basis 02
- Qt实战|Qt+OpenCV联合开发(二十一)--图像翻转与旋转
- Qt实战|Qt+OpenCV联合开发(十四)--图像感兴趣区域(ROI)的提取
- Qt实战|Qt+OpenCV联合开发(十三)--通道分离与合并
- opencv|Qt+OpenCV联合开发(十六)--图像几何形状绘制
- Qt实战|Qt+OpenCV联合开发(十七)--随机数与随机颜色
- SNAT的MASQUERADE地址选择与端口选择
- IPTABLES的连接跟踪与NAT分析
- IPVS分析