● 变量名是直接引用一个值
● 指针是间接引用一个值
● 通过指针引用一个值,称为 间接寻址
● int *p;
● 声明了一个 int * 类型,即指向整数的指针变量 p(p是一个指向int的指针)或(p指向一个int型的对象)
● 指针必须初始化
- 可以在定义指针是进行
- 可以通过一个赋值语句来完成
- 指针可以被初始化为 NULL,0,或者一个地址
● 取地址运算符 & ,一元运算符,返回其操作数的地址值。
- 操作数必须是一个变量。
- 不能应用于常量或者表达式。
● 间接寻址运算符 * ,解引用运算符(脱引用运算符)
- 返回其操作数(即一个指针)指向的对象的值
● 向函数传递实参
- 按值传递(C语言中所有实参都是按值传递的)
- 按引用传递支持被调函数通过修改主调函数中的变量,从而实现向主调函数"返回"多个值
● 用一个指针来接收一个地址,一个函数若期望接收一个地址作为实参,就必须先定义一个指针类型的形参来接收这个地址
● const限定符的作用是告诉编译器被其限定的变量的值是不可修改的
● 向函数传递指针的方式有4种
- 指向可变数据的可变指针
- 指向可变数据的常量指针
- 指向常量数据的可变指针
- 指向常量数据的常量指针
- 用指向可变数据的可变指针将字符串中的字符改成大写
● “指向可变数据的可变指针”具有最高的数据访问权限。可通过对指针解引用来改写该指针所指向存储单元中的数据。 - 用指向常量数据的可变指针逐个打印字符串中的字符
● 可以修改“指向常量数据的可变指针”,使其指向相应类型的任何数据项,但是它所指向的数据是不可修改的。
● 这样的指针可以用于期望接收一个数组实参的函数,该函数将在不改变数组元素值的情况下,处理数组的每个元素。 - 试图修改指向可变数据的常量指针
● 一个“指向可变数据的常量指针”所指向的内存单元总是不变的,二存储在这个内存单元中的数据可以通过指针来改写。
● 声明为const的指针,必须在定义的同时进行初始化(若指针是函数的形参,则由传递给函数的指针实参来初始化)
● int *const ptr 从右往左读“ptr是一个常量指针,指向一个整数”
● int *const 类型表示变量被定义为常量指针 - 试图修改指向常量数据的常量指针
● 该方式只有最小的访问权限。
● 这样的指针指向一个固定的内存单元,而该内存单元中的数据是不可修改的。
● const int *const ptr = &x;
从右往左读“ptr是一个常量指针,指向一个常量整数”。
● 给指针加上或者减去一个整数时,指针的增减并非简单地就是这个整数,而是这个证书乘以指针所指向的对象的字节长度,这个字节长度取决于对象的数据类型。
● 可以理解为指针加一即指向下一个元素
● 当一个指针变量减去另一个指针变量时,得出的结果是两个指针之间的数组元素的个数。
● 将一个指针指向另一个指针
● 仅在类型相同时,一个指针才能赋值给另一个指针。这个原则的一个例外就是指向 void 的指针(void*),它是一个可以表示任何指针类型的通用指针。
● 可以用指向void的指针来给任意类型的指针赋值,也可以用任意类型的指针来给指向void的指针赋值。在两种情况下,都无需使用转换运算符。
● 指向void的指针
● 不可以解引用。
● 指向void的指针只是简单地包含一个未知数据类型的首地址,这个指针将一次访问的确切存储单元字节数对于编译器而言是未知的。编译器必须知道数据的类型才能确定解引用一个特定的指针应该访问的字节数。