c语言指针总结

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'

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值