指针
-
指针的定义
- 地址
- 内存单元的编号
- 从零开始的非负整数
- 范围: 0 - (电脑内存大小)
- 指针
- 指针就是地址,地址就是指针
- 地址就是内存单元的编号
- 指针变量是存放地址的变量
- 指针和指针变量是两个不同的概念
- 但是要注意: 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样
- 指针本质就是一个操作受限的非负整数
- 地址
-
指针的分类
- 基本类型指针
- 注意问题
int * p; //p是变量的名字,int * 表示p变量存放的是int类型变量的地址 // int * p; 不表示定义了一个名字叫做*p的变量 // int * p; 应该这样理解: p是变量名,p是变量的数据类型是int *类型 所谓int * 类型,实际就是存放int变量地址的类型 int i = 3; // p = i; //这是错误的,因为类型不一致,p只能存放int类型变量的地址,不能存放int类型变量 //p = 33; //error 问题同上 p = &i; // OK p = &i; /* 1. p保存了i的地址,因此p指向i 2. p不是i,i也不是p,跟准确的说:修改p的值不影响i的值,修改i的值也不影响p的值 3. 如果一个指针变量指向了某个普通变量, 则*指针变量,就完全等同于 普通变量 - 例子: - 如果p是个指针变量, 并且p存放了普通变量i的地址, - 则p指向了普通变量i. - *p 就完全等同于i - 或者说: 在所有出现*p的地方都可以替换成i - 在所有出现i的地方都可以替换成*p - *p就是以p的内容为地址的变量 */
- 如果更改*p的内容则i的内容也会更改
- 例子:
# include <stdio.h> int main(void) { int * p; int i = 3; p = &i; printf ("*p = %d\n", *p); *p = 13; printf ("i = %d\n", i); return 0; } /* 输出结果: *p = 3 i = 13 */
- 例子:
- 如果更改*p的内容则i的内容也会更改
- 附注
- *号的含义
- 乘法
- 定义指针变量
int * p; //定义了一个名叫p的变量,int *表示p只能存储放int变量的地址
- 指针运算符(书上是:目标运算符)
- 该运算符放在定义号的指针变量的前面,如果p是一个已经定义号的指针变量.则*p表示 以p的内容为地址的变量
- 如何通过被调函数修改主调函数普通变量的值
- 实参必须为该 普通变量的地址
- 形参必须为指针变量
- 在被调函数中通过 *形参名 = … 的方式就可以修改主调函数相关变量的值
- *号的含义
- 注意问题
- 指针和数组
- 指针和一维数组
- 数组名
- 一维数组名
- 一维数组名是个指针常量
- 它存放的是一维数组第一个元素的地址
- 例:
int a[5] // a的值和a[0]的值是一样的
- 例:
- 一维数组名
- 下标和指针的关系
- 如果p是个指针变量, 则 p[i] 永远等价于 *(p+i)
- 确定一个一维数组需要几个参数【如果一个函数要处理一个一维数组,则需要接收该数组的哪些信息】
- 指针变量的运算
- 数组名
- 指针和二维数组
- 指针和一维数组
-
指针和函数
-
指针和结构体
- 多级指针
- 基本类型指针