Summary
1)指针的实质是变量
,非凡在于 存储的内容是一段内存地址
。
2)在指针 申明时
,* 号
示意所申明的 变量为指针
;在指针 应用时
,* 号
示意取指针所指向的 内存空间中的值
3)指针作为函数参数:
- 指针是变量,因而能够申明
指针参数
- 当一个函数体外部须要
扭转实参的值
- 则须要应用指针参数;函数调用时
实参值将复制到形参
- 指针实用于
简单数据类型作为参数
的函数中
4)口诀:左数右指
— 当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
- 在指针
申明时
,* 号
示意所申明的变量为指针
- 在指针
应用时
,* 号
示意取指针所指向的内存空间中的值
2、传值调用和传址调用
- 指针是变量,因而能够申明
指针参数
- 当一个函数体外部须要
扭转实参的值
,则须要应用指针参数 - 函数调用时
实参值将复制到形参
-
指针实用于
简单数据类型作为参数
的函数中// 指针作为参数剖析 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, 2 swap2(&a, &b); // 将实参 a 和 b 的地址,赋值给参数指针 pa 和 pb,函数外部应用 * 号关上了这两个地址,并批改了外面的值,所以里面的实参也会变 printf("%d, %d\n", a, b); // 2, 1 return 0; }
3、const 和指针
口诀:左数右指
— 当const
呈现在 * 号左侧
时,指向的 数据为常量
;当const
呈现在 * 号右侧
时,指针为常量
。
const int* p; // 指针 p 可变,指向的数据 * p 不可变
int const* p; // 指针 p 可变,指向的数据 * p 不可变
int* const p; // 指针 p 不可变,指向的数据 * p 可变
const int* const p; // 指针 p 不可变,指向的数据 * p 也不可变
本文总结自“狄泰软件学院”唐佐林老师《C 语言进阶课程》。
如有错漏之处,恳请斧正。