C指针

1 指针变量的定义和初始化
● 一个指针包含的是存放数值的一个变量的地址。在这个意义上,变量名是直接引用一个值,而指针是间接引用一个值
● 通过指针引用一个值,称为间接寻址
● 指针可以被定义成指向任何类型的对象
● 指针必须初始化,初始化可以在定义指针时进行,也可以通过一个赋值语句来完成。指针可以被初始化为NULL,0或一个地址。值为NULL的指针表示它不指向任何对象。将指针初始化为0等价于初始化为NULL,但是初始化为NULL更明确,更好。0是可以直接赋值给指针变量的唯一整数值
● NULL是一个在头文件<stddef.h>(以及其他头文件中)定义的符号常量
2 指针运算符
● 取地址运算符 & 是一个一元运算符它返回其操作数的地址值
● 取地址操作符的操作数必须是一个变量
● 间接寻址运算符 * 返回其操作数指向对象的值
● printf 中的转换说明符%p,在绝大多数平台上,以十六进制整数形式输出一个内存地址
3 按引用向函数传递实参
● C语言中,所有实参都是按值传递的
● C语言提供了使用指针和间接寻址运算符来模拟按引用传递的功能。若要(模拟)按引用调用方式传递一个变量,则只需对该变量名应用取地址运算符(&)即可。
● 当一个变量的地址传递给函数后,该函数就可以使用间接寻址操作符(*)来修改主调函数中相应内存单元中的数值
● 一个函数若要接受一个地址作为实参,则必须定义一个指针类型的形参来接收这个地址
● 编译器并不区分接收指针的函数与接收单下标数组的函数。这就意味着,函数必须“清楚”它接受到的是一个数组还是(模拟)按引用传递过来的一个变量
● 当编译器遇到形如 int b[ ] 的表示单下标数组的函数形参时,编译器就将该形参转换成指针表示形式 int *b
4 对指针使用const限定符
● const限定符用于指示一个特殊变量的值是不可修改的
● 如果试图去改变一个声明为 const 的变量的值,那么编译器会给出警告,或者提示错误
● 向函数传递的指针有4中:

  1. 指向可变数据的可变指针
  2. 指向可变数据的常量指针
  3. 指向常量数据的可变指针
  4. 指向常量数据的常量指针

● 对于一个“指向可变数据的可变指针”,该数据可以通过对指针的解引用来修改,同时,也可以修改指针,使其指向其他的数据项
● 可以修改一个指向常量数据的可变指针,使其指向相应类型的任何数据项,但是他所指向的数据项的值是不能修改的
● “指向可变数据的常量指针”所指向的内存单元总是不变的,而存储在这个内存单元中的数据可以通过指针来改写。数组名就默认为这种指针
● “指向常量数据的的常量指针”所指向的内存单元总是不变的,并且该内存单元中的数据也是不能修改的
6 sizeof 运算符
● 一元运算符 sizeof 可以在编译期间计算出一个变量或者一种数据类型的字节长度
● 当应用于一个数组名时,运算符 sizeof 返回该数组所占的字节总数
● 可以应用于任何变量名、数据类型或数值
● 当操作数是一个类型名时,sizeof 需要使用一对圆括号将这个类型名括起来
7 指针表达式和指针算术运算
● 指针只能参与有限的集中算数运算。指针可以增 1(++)或减 1(––),指针可以加上一个整数(+ 或 += ),也可以从指针中减去一个整数( – 或 –= ),从一个指针中减去另一个指针
● 当给指针加上或减去一个整数时,指针的增/减值等于这个整数乘以指针所指对象的数组元素个数
● 只有在类型相同时,一个指针才能赋值给另一个指针。这个原则的一个例外就是类型为 void * 的指针,它是一个可以表示任何指针类型的通用指针。可以用指向 void 的指针来给任意类型的指针赋值,也可以用任意类型的指针来给指向 void 的指针赋值
● void * 型指针不能被解引用
● 可以用相等运算符和关系运算符来对指针进行比较。但是,只有在这两个指针指向的是同一数组的元素时,这样的比较运算才是有意义的。指针比较运算就是比较存储于指针中的地址值的大小
● 指针比较的一个常见用途是判断一个指针是否为NULL
8 指针和数组的关系
● 在C语言中,数组和指针的联系极为密切,它们经常是互换使用的
● 一个数组名可以看成是一个常量指针
● 指针可以用于任何设计数组下标的操作
● 当一个指针指向数组的起始位置时,给这个指针加上一个偏移量就表示要引用数组中的哪一个元素偏移量的值与数组的下标是相同的。这种表示法称为指针/偏移量表示法
● 数组名本身可以被当成一个指针,在指针算数运算中使用。但这样的运算不能修改数组名所代表的地址
● 可以完全像数组那样对指针用下标的形式来引用。这被称为指针/下标表示法
● 一个类型为 const char* 的形参一般表示的是一个常量字符串
9 指针数组
● 一个指向函数的指针包含的是一个函数在内存中的地址。函数名其实就是执行该函数功能的程序代码在内存中的起始地址
● 指向函数的指针既可以作为实参传递给函数,也可以作为返回值从函数返回,还可以存入数组或者赋值给其他函数指针
● 对一个指向函数的指针进行解引用,就是调用其指向的函数。调用一个函数时,可以将指向它的指针当成函数名直接使用
● 函数指针通常应用于“基于文本的菜单驱动的系统”

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枳洛淮南✘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值