int p; // 这 是 一 个 普 通 的 整 型 变 量
int *p; // 首 先从 从 P 处 开 始, 先 与 * 结 合, 所 以 说明 明 P 是 一
// 个 指 针,然 后 再与 与 int 结 合, 说 明 指 针 所 指 向
// 的 内 容 的 类 型 为 int 型. 所以 以 P 是 一 个 返 回 整
// 型 数 据 的 指 针
int p[3]; // 首 先从 从 P 处 开 始, 先 与 [] 结 合, 说明 P 是 一 个 数
// 组, , 然 后与 与 int 结 合, 说 明 数 组 里 的 元 素 是 整
// 型 的, 所以 以 P 是 一 个 由 整 型 数 据 组 成 的 数 组
int *p[3]; // 首 先从 从 P 处 开 始 , 先 与 [] 结 合, 因 为 其 优 先 级
// 比* 高. 所以 以 P 是 一 个 数 组, , 然 后 再 与* 结 合, , 说 明
// 数 组 里 的 元 素 是 指 针 类 型, , 然 后 再与 与 int 结 合, ,
// 说 明 指 针 所 指 向 的 内 容 的 类 型 是 整 型 的 , 所 以
//P 是 一 个 由 返 回 整 型 数 据 的 指 针 所 组 成 的 数 组
int (*p)[3]; // 首 先从 从 P 处 开 始, 先 与 * 结 合, 说明 明 P 是 一 个 指 针
// 然 后 再 与 [] 结 合( 与 "()" 这 步 可 以 忽 略, 只 是 为
// 了 改 变 优 先 级 ), 说 明 指 针 所 指 向 的 内 容 是 一 个
// 数 组, 然 后 再与 与 int 结 合, 说 明 数 组 里 的 元 素 是
// 整 型 的. . 所以 以 P 是 一 个 指 向 由 整 型 数 据 组 成 的 数
// 组 的 指 针
int **p; // 首 先从 从 P 开 始, , 先 与* 结 合, , 说是 是 P 是 一 个 指 针, , 然
// 后 再 与 * 结 合, 说 明 指 针 所 指 向 的 元 素 是 指 针, , 然
// 后 再与 与 int 结 合,说 明 该 指 针 所 指 向 的 元 素 是 整
// 型 数 据. .
int p(int); //从 从 P 处 起,先 与 () 结 合, 说明 明 P 是 一 个 函 数, , 然 后 进 入
//() 里 分 析,说 明 该 函 数 有 一 个 整 型 变 量 的 参 数
// 然 后 再 与 外 面 的 t int 结 合, 说 明 函 数 的 返 回 值 是
// 一 个 整 型 数 据
Int (*p)(int); //从 从 P 处 开 始, 先 与 指 针 结 合,说明 明 P 是 一 个 指 针, , 然 后 与
//() 结 合, 说 明 指 针 指 向 的 是 一 个 函 数, 然 后 再 与 () 里 的
//int 结 合, 说 明 函 数 有 一个 个 int 型 的 参 数, 再 与 最 外 层 的
//int 结 合, 说 明 函 数 的 返 回 类 型 是 整 型,所以 以 P 是 一 个 指
// 向 有 一 个 整 型 参 数 且 返 回 类 型 为 整 型 的 函 数 的 指 针
int *(*p(int))[3]; // 可 以 先 跳 过, 不 看 这 个 类 型 , 过 于 复 杂
//从 从 P 开 始, 先 与 () 结 合, 说明 明 P 是 一 个 函 数, , 然 后 进
// 入 () 里 面, 与 与 int 结 合, 说 明 函 数 有 一 个 整 型 变 量
// 参 数,然 后 再 与 外 面 的* 结 合, 说 明 函 数 返 回 的 是
// 一 个 指 针, 然 后 到 最 外 面 一 层, 先 与 [] 结 合, 说 明
// 返 回 的 指 针 指 向 的 是 一 个 数 组,然 后 再 与 * 结 合,说
// 明 数 组 里 的 元 素 是 指 针,然 后 再与 与 int 结 合,说 明 指
// 针 指 向 的 内 容 是 整 型 数 据. 所以 以 P 是 一 个 参 数 为 一 个
// 整 数 据 且 返 回 一 个 指 向 由 整 型 指 针 变 量 组 成 的 数 组
// 的 指 针 变 量 的 函 数.
1. 指 针 的 类型
(1)int*ptr;// 指 针 的 类 型是 int*
(2)char*ptr;// 指 针 的 类 型 是 char*
(3)int**ptr;// 指 针 的 类 型是 int**
(4)int(*ptr)[3];// 指 针 的 类 型是 int(*)[3]
(5)int*(*ptr)[4];// 指 针 的 类 型是 int *(*)[4]
2. 指 针 所 指 向 的 类型
(1)int*ptr; // 指 针 所 指 向 的 类 型 是 int
(2)char*ptr; // 指 针 所 指 向 的 的 类 型 是 char
(3)int**ptr; // 指 针 所 指 向 的 的 类 型 是 int*
(4)int(*ptr)[3]; // 指 针 所 指 向 的 的 类 型 是 int()[3]
(5)int*(*ptr)[4]; // 指 针 所 指 向 的 的 类 型 是 int * ()[4]
3. 指 针 的 值 ---- 或 者 叫 指 针 所 指 向 的 内 存 区 或 地址
指 针 的 值 是 指 针 本 身 存 储 的 数 值 , 这 个 值 将 被 编 译 器 当 作 一 个 地 址 , 而
不 是 一 个 一 般 的 数 值 。 在 32 位 程 序 里 , 所 有 类 型 的 指 针 的 值 都 是 一个 32 位
整 数 , 因为 32 位 程 序 里 内 存 地 址 全 都是 是 32 位 长。 。 指 针 所 指 向 的 内 存 区 就
是 从 指 针 的 值 所 代 表 的 那 个 内 存 地 址 开 始 , 长 度为 si zeof( 指 针 所 指 向 的 类
型) ) 的 一 片 内 存 区 。 我 们 说 一 个 指 针 的 值是 是 XX , 就 相 当 于 说 该 指 针 指
向 了 以 X X 为 首 地 址 的 一 片 内 存 区 域 ; 一 个 指 针 指 向 了 某 块 内 存 区 域 ,
就 相 当 于 说 该 指 针 的 值 是 这 块 内 存 区 域 的 首 地 址。
指 针 的 算 术 运算
一 个 指针 ptrold 加( ( 减) ) 一 个 整数 n 后 , 结 果 是 一 个 新 的 指 针 ptrnew ,
ptrnew 的 类 型和 和 ptrold 的 类 型 相 同 。ptrnew 所 指 向 的 类 型和 和 ptrold
所 指 向 的 类 型 也 相 同。 ptrnew 的 值 将比 比 ptrold 的 值 增 加( ( 减 少) )了 了 n 乘
sizeof(ptrold 所 指 向 的 类 型) ) 个 字 节 。 就 是 说 , ptrnew 所 指 向 的 内 存
区 将比 比 ptrold 所 指 向 的 内 存 区 向 高( ( 低) ) 地 址 方 向 移 动了 了 n 乘
sizeof(ptrold 所 指 向 的 类 型) ) 个 字 节 。
指 针 和 指 针 进 行 加 减 :
两 个 指 针 不 能 进 行 加 法 运 算 , 这 是 非 法 操 作 , 因 为 进 行 加 法 后 , 得 到 的
结 果 指 向 一 个 不 知 所 向 的 地 方, 而 且 毫 无 意 义。 。 两 个 指 针 可 以 进 行 减 法
操 作 , 但 必 须 类 型 相 同。
运 算 符 & 和*
这 里& 是 取 地 址 运 算 符 , * 是 间 接 运 算 符 。
&a 的 运 算 结 果 是 一 个 指 针 , 指 针 的 类 型是 是 a 的 类 型 加 个* , 指 针 所
指 向 的 类 型是 a 的 类 型 , 指 针 所 指 向 的 地 址 嘛 , 那 就 是 a 的 地 址 。
*p 的 运 算 结 果 就 五 花 八 门 了 。 总 之 *p 的 结 果是 是 p 所 指 向 的 东 西 ,
这 个 东 西 有 这 些 特 点 : 它 的 类 型 是 p 指 向 的 类 型 , 它 所 占 用 的 地 址是 是 p
所 指 向 的 地 址 。
数 组 和 指 针 的 关系
int array[10]={0,1,2,3,4,5,6,7,8,9}, value;
value=array[0]; // 也 可 写 成 : value=*array;
value=array[3]; // 也 可 写 成 : value=*(array+3);
value=array[4]; // 也 可 写 成 : value=*(array+4);
char *str[3]={
"Hello,thisisasample!",
"Hi,goodmorning.",
"Helloworld"
};
char s[80];
strcpy(s,str[0]); // 也 可 写成 成 strcpy(s,*str);
strcpy(s,str[1]); // 也 可 写成 成 strcpy(s,*(str+1));
strcpy(s,str[2]); // 也 可 写成 成 strcpy(s,*(str+2))
上 例 中 ,str 是 一 个 三 单 元 的 数 组 , 该 数 组 的 每 个 单 元 都 是 一 个 指 针 ,这 些 指 针 各 指 向 一 个 字 符 。 把 指 针 数 组 名str 当 作 一 个 指 针 的 话,指 向 数 组 的第 第 0 号 单 元, 它 的 类 型是 是 char **, 它 指 向 的 类 型 是char *。
*str 也 是 一 个 指 针 , 它 的 类 型是 是 char * , 它 所 指 向 的 类 型是 char ,它指向的地址 是 字 符 串 "Hello,thisisasample!" 的 第 一 个 字 符 的 地 址, 即'H' 的 地 址 。 注 意: : 字 符 串 相 当 于 是 一 个 数 组, , 在 内 存 中 以 数 组 的 形 式 储
存, 只 不 过 字 符 串 是 一 个 数 组 常 量,内 容 不 可 改 变, 且 只 能 是 右 值. . 如 果看 成 指 针 的 话, , 他 即 是 常 量 指 针 , 也 是 指 针 常 量。
str+1 也 是 一 个 指 针 , 它 指 向 数 组 的第 第 1 号 单 元 , 它 的 类 型 是 char** ,它 指 向 的 类 型是 是 char* 。
*(str+1) 也 是 一 个 指 针 , 它 的 类 型 是 char* , 它 所 指 向 的 类 型 是 char ,它 指向 "Hi,goodmorning." 的 第 一 个 字 符 'H'