指针pointer

数据类型决定了变量可以表示的数值范围。除此之外,表示变量在内存中生命期范围存储期以及变量名也都是变量的重要属性。

取址运算符-address operator单目运算符`&`     `&a`     取得`a`的地址(生成指向a的指针)

取址运算符&的功能是取得对象的地址。对于使用register关键字声明的寄存器对象,不能加上取址运算符&.

指针int foo = 178;int *pf = &foo;

printf("pointer value == %d\n", *pf);printf("foo value == %d\n", foo);//pointer value == 178//foo value == 178

上例中,变量名前加*,通过该声明定义了指向int型变量的指针变量,他们指向的是int型变量。

以上的两种形式可以理解为:int型变量: 保存整数的盒子

指向int型变量的指针变量:保存存放整数对象的地址的盒子。

指针运算符单目运算符 *    *p     p指向的对象

根据上例,可以得出:

*pf就是foo,*pf是foo的别名(alias)

解引用

通过在指针前写上指针运算符*来访问该指针指向的对象,称为解引用(dereference)

例: *pf

指针的类型

指向Type型对象的指针,即Type*型指针。并不是表示指向OO号,更确切地说是指向以OO号为首地址的Type型对象

空指针 - null pointer

什么也不指向的特殊指针是空指针(null pointer),表示空指针的对象式宏NULL是空指针的常量。

指针和数组

数组名原则上会被解释为指向该数组起始元素的指针。指针p指向数组中的元素e时,

p + i为指向元素e后第i个元素的指针

p - i为指向元素e前第i个元素的指针void array_pointer(void){    int a[5] = {1, 2, 3, 4, 5};    int *p = a;

for (int i = 0; i

}

} /*

&a[0] = 0x7ffeefbff4f0 p+0 = 0x7ffeefbff4f0

&a[1] = 0x7ffeefbff4f4 p+1 = 0x7ffeefbff4f4

&a[2] = 0x7ffeefbff4f8 p+2 = 0x7ffeefbff4f8

&a[3] = 0x7ffeefbff4fc p+3 = 0x7ffeefbff4fc

&a[4] = 0x7ffeefbff500 p+4 = 0x7ffeefbff500

*/

数组名在什么情况下不被视为指向起始元素的指针作为sizeof运算符的操作数出现时sizeof(array)不会生成指向起始元素的指针的长度,而是生成数组整体的长度作为取址运算符&的操作数出现时&数组名不是指向起始元素的指针的指针,而是指向数组整体的指针。

指针运算符和下标运算符当指针p指向数组中的元素e时,

指向e后第i个元素的*(p + i),可以写为p[i];

指向e前第i个元素的*(p - i),可以写为p[-i]Type*型指针p指向Type型数组a的起始元素a[0]时,指针p的行为就和数组a本身一样。数组的下标表示位于起始元素后的第几个元素的位置,因此必须从0开始。虽然可以为指针加上整数,但是指针之间相加是不可以的

下标运算符的操作数* (p + i)

括号内的p + i, 是p和i的加法运算。和算术类型的数值间的加法运算a + b等同于b + a一样, p + i也等同于i + p。

也就是说, * (p + i) 和 * (i + p)是等价的。

这样一来,是不是访问数组元素的表达式p[i]也可以写成i[p]呢。实际上确实是可以的。

下标运算符[],是具有两个操作数的双目运算符。

其中一个操作数的类型是:指向Type型对象的指针

另一个操作数的类型是:整数类数据类型

下标运算符[]的操作数的顺序是随意的。就像a + b等同于b + a一样, a[3]和3[a]也是一样的。

下标运算符[]所生成的值的类型是Type型指针p指向数组a的起始元素a[0]时,a[i]    *(a + i)        p[i]      *(p + i)

这4个表达式表示的都是相同的元素。实际上a[i]   i[a]   *(a + i)   *(i + a)    p[i]    i[p]    *(p + i)    *(i + p)

这8个表达式表示的都是相同的元素。

数组和指针的不同点int *p;int y[5];

p = y;    //OKint a[5];int b[5];

a = b;    //错误赋值表达式的左操作数不可以是数组名。

数组的传递

在函数间传递数组时,可以灵活应用指针和数组的相似性。void arr_set(int v[], ...){   /*----do sth------*/}void arr_set(int v[5], ...){   /*-----do sth-----*/}void arr_set(int *v, ...){   /*-----do sth-----*/}

以上三个函数, 第一个和第二个都可以解释为第三个。 形参V的类型不是数组, 而是指针。即使像第二个函数那样指定元素个数,该值也会被无视。

调用上述arr_set函数时,int*型的形参V将使用实参a,即&a[0]进行初始化。

作者:Jeremy_L_Wang

链接:https://www.jianshu.com/p/682fc61e04c7

c语言指针慕课,C语言-指针相关推荐

  1. c语言指针慕课,C语言指针

    https://blog.csdn.net/constantin_/article/details/79575638 就上面的博客作一下笔记: 关于[int (*p)[3]]与[int *p[3]]两 ...

  2. 关于C语言中的数组指针、指针数组以及二级指针

    概念解释 数组指针:首先它是一个指针,它指向一个数组,即指向数组的指针:在32 位系统下永远是占4 个字节,至于它指向的数组占多少字节,不知道.数组指针指向的是数组中的一个具体元素,而不是整个数组,所 ...

  3. C语言指针数组与数组指针的区别

    C语言指针数组与数组指针的区别 首先,顾名思义 数组指针是一个指针,是指向一个数组的指针,如 int (a*)[5]:这就是一个指向含有5个元素的数组的指针 指针数组是一个数组,它包含的元素全是指针变 ...

  4. 为什么指针被誉为 C 语言灵魂?

    作者 | 编程指北 来源 |  编程指北(ID:cs_dev) 这一篇的文章主题是「指针与内存模型」. 说到指针,就不可能脱离开内存,学会指针的人分为两种,一种是不了解内存模型,另外一种则是了解. 不 ...

  5. C语言指针高级部分:void指针和数据指针

    概念 void指针     数据指针 void指针 void指针的基本概念 void的意思就是"无类型",void指针则为"无类型指针",void指针可以指向任 ...

  6. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针排序 | 通过 交换指针指向的内存数据 方式进行排序 )

    文章目录 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针指向的内存数据 方式进行排序 ) 在上一篇博客 [C 语言]二 ...

  7. 【C 语言】二级指针作为输入 ( 自定义二级指针内存 | 二级指针 排序 | 通过 交换指针方式 进行排序 )

    文章目录 一.二维指针 排序 ( 通过 交换指针方式 进行排序 ) 二.完整代码示例 一.二维指针 排序 ( 通过 交换指针方式 进行排序 ) 在上一篇博客 [C 语言]二级指针作为输入 ( 二维指针 ...

  8. 【C++ 语言】引用 ( 引用简介 | 指针常量 | 常量指针 | 常引用 | 引用参数 | 引用 指针 对比 )

    文章目录 I . 引用概念 II . 引用声明 III . 引用 地址 内存 分析 IV . 常引用 V . 引用作为参数 VI . 引用 与 指针 对比 I . 引用概念 C++ 对 C 扩充 : ...

  9. 【C 语言】指针 与 数组 ( 指针 | 数组 | 指针运算 | 数组访问方式 | 字符串 | 指针数组 | 数组指针 | 多维数组 | 多维指针 | 数组参数 | 函数指针 | 复杂指针解读)

    相关文章链接 : 1.[嵌入式开发]C语言 指针数组 多维数组 2.[嵌入式开发]C语言 命令行参数 函数指针 gdb调试 3.[嵌入式开发]C语言 结构体相关 的 函数 指针 数组 4.[嵌入式开发 ...

最新文章

  1. Proovread安装与试用
  2. 2021年传感器行业的机遇与风险 | 深度思考
  3. 部署awstats分析系统
  4. 计算机维修工中级实践考试,计算机维修工(中级)技能考核.doc
  5. RME二次开发之“修改矩形风管为圆形风管”即实现“天圆地方”连接。
  6. 网络经济与企业管理(第 1 章:企业管理概论)
  7. SCI、EI、ISTP、ISR、SSCI、AHCI简介
  8. 易筋SpringBoot 2.1 | 第廿四篇:SpringBoot访问Docker中的MongoDB
  9. 加多宝首度披露"换头手术"的详细内幕
  10. java builder_带继承的Java Builder模式
  11. python利用reportlab打印图文并茂内容
  12. 国内各大高校开源镜像站
  13. vue 图片 404 显示默认图片
  14. 歌礼与先声签订利托那韦片供应协议;索迪斯华东物流新仓于上海松江区开业 | 美通企业日报...
  15. java,mysql,oracle出现科学记数法问题
  16. dataframe 中的多层索引
  17. 雷军:从苦逼撸代码到年入上百亿,成为商界领袖,改变现状,只靠单纯写代码远远不够
  18. js字符串根据某个特殊字符截取字符串
  19. Qt 实现带阴影 无边框的QMessageBox
  20. 马斯克自述:我很痛苦,我一无所有,我不后悔

热门文章

  1. 同心抗疫,IBM中国有限公司致客户的一封信
  2. 计算机编程的 20 年变迁!
  3. 华为前员工李洪元:我的诉求只有见任总能解决;音悦台被传倒闭;.NET Core 3.1 发布 | 极客头条...
  4. GitLab地域封锁,总监愤而辞职!苹果产品路线图曝光;CAT 0.1.0发布|极客头条...
  5. 支付宝核心工程师谈如何成为一名优秀的程序员?
  6. PHP 程序员危机:如何快速成长为不可或缺的技术人才?
  7. java 查询sql_Java 中如何使用 SQL 查询文本
  8. matlab求解含两个累加公式的方程,使用fsolve 函数求解含两个参数的多个方程问题,希望有会的人帮...
  9. mysql查出的结果太大 php_如何解决PHP使用mysql_query查询超大结果集超内存问题
  10. 金融matlab创建3x3数组,Matlatb金融时间序列工具箱——建立金融时间序列