我们之前研究的数据类型, 语句, 函数等等,这些内容可以认为是编写程序的基础,除了c语言之外,在其他的编程语言当中也会有相似的内容

我们接下来要研究的指针,可以认为是c语言独有的特性,学会如何的使用指针,才能认为在c语言的学习过程中达到入门的程度

1 什么是指针

假如我们定义了一个变量a

int a = 100;

之前我们学习的知识可以告诉我们在这句代码执行的时候会发生什么

我们会开辟一块储存空间,并且把空间的名字命名为a,在a空间当中储存了数据100的2进制形式

那么如果我想知道开辟的空间在内存当中的什么位置,那么可能会需要用到一个运算符 &

&运算符在作为双目运算符的时候表示位与运算,作为单目运算符的时候就表示取地址运算

#include <stdio.h>
int main(){int a=100;printf("%dn",&a);printf("%xn",&a);printf("%p",&a);return 0;
}

这里我们打印了 &a的值,也就是在内存当中的地址

使用三种格式,第一种是10进制的整数,第二种是16进制的整数,第三种是一个新的占位符,可以表示一个地址的格式,其实就是一个8位的16进制数字

我们可以把数据的地址作为一种新的数据类型,用来处理这种新数据类型的变量就是指针

声明指针类型的变量的语法

<数据类型> * 指针名;

这里又出现了一个熟悉的运算符 * ,在作为双目运算符的时候,*可以表示乘法;出现在声明语句中的时候,表示指针类型;在作为单目运算符的时候表示取一个地址当中的值(接下来会讲)

那么对于之前的变量a,我们就可以这样处理

#include <stdio.h>
int main(){int a=100;int * p=&a;printf("a的地址是:%pn",&a);printf("p指针指向的地址是:%pn",p);printf("a的值是:%dn",a);printf("p指向地址保存的值是:%d",*p);return 0;
}

在这里可以看出 p 和 &a是相同的, *p和a是相同的,单目运算符*表示对一个指针进行取值操作

我们把容易混淆的概念总结一下

  • a是整型变量;
  • p是指针;
  • &a是取地址运算得到的是a的地址
  • *p是取值运算,得到的是p指向地址当中的值
  • a==*p
  • p==&a

2 指针的运算

指针保存的地址本身也是数据,也可以进行运算

指针类型的变量可以进行 +(加),-(减)和比较运算

指针的比较通常是比较两个指针地址是否相等,来判断两个指针是否指向同一个数据

#include <stdio.h>
int main(){int a=100;int * p1=&a;int * p2=&a;printf("p1和p2是否指向了相同的地址:%dn",p1==p2);*p1 = 120;printf("p1地址当中的值改变之后,p2地址的值:%d",*p2);return 0;
}

p1和p2指向了相同的地址,p1指向地址的值改变之后p2地址的值也发生变化了,因为他们指向的是同一块地址

指针的加减运算就相当于移动指针变量所指的位置,但是移动的多少要由指针的类型来决定

#include <stdio.h>
int main(){int a=100;int *p = &a;printf("%pn",p);printf("%pn",p+1);printf("%p",(int)p+sizeof(int));return 0;
}

我们让 int 类型的指针加一,但是实际的地址增加的并不是一,而是一个int类型的长度

#include <stdio.h>
int main(){int a=100;double *p = &a;printf("%pn",p);printf("%pn",p+1);printf("%p",(int)p+sizeof(double));return 0;
}

同样的double类型的指针加1,增加的地址是一个double类型的长度

所以我们可以得出结论:指针的加减运算就相当于

如果指针p是int型 p+1,就相当于得到一个新地址,这个地址等于原地址加上一个int的长度

如果指针p是float型 p+1,就相当于得到一个新地址,这个地址等于原地址加上一个float的长度

...

归纳总结一下

指针的加减运算,就相当于得到一个新地址,这个地址等于原地址加上(减去)数据类型长度倍的运算数

printf 指针地址_c语言入门 第十四章指针相关推荐

  1. printf输出字符串_c语言入门 第十二章 字符串

    在c当中有一种数组是由char类型构成的,其中的元素都是字符,如果这个字符数组是以字符编码0('0'字符)结尾的,那么我们就叫这个字符数组为字符串 字符串的数据常量形式是使用双引号包围的字符序列 1 ...

  2. c语言调试时出现的三种错误,C语言课件 第十四章 常见错误和程序调试

    <C语言课件 第十四章 常见错误和程序调试>由会员分享,可在线阅读,更多相关<C语言课件 第十四章 常见错误和程序调试(36页珍藏版)>请在人人文库网上搜索. 1.第十四章常见 ...

  3. printf 指针地址_c语言对指针的理解

    先来讲一下本人学指针的经历:大一的时候刚接触c语言对指针这东西真的是太迷了,感觉麻烦难懂不想其他语言一样.但是搞懂以后就被指针的魅力吸引甚至喜欢上c语言.不多讲,开始!(文章可能有些长,但放心全是基础 ...

  4. printf输出字符串_C语言入门必学第一课,学习“输入与输出”!

    数据输入 编写程序的主要目的就是为了处理数据.数据从哪里来?数据的来源有很多种方式,如从磁盘文件中读取数据.从数据库中读取数据.从网页中抓取数据等,还有一种原始的方式就是从键盘输入数据. 在C语言中, ...

  5. c++如何打印一维数组首地址_C语言之二维数组和指针的结合

    最近在练习 C 语言计算机二级的程序设计题,碰到了二维数组和指针的结合,当时怎么调试都不对,自己也记不清楚该怎么用了就跑去看书翻资料重新复习.自己纠结的问题是二维数组 int a[3][4]的数组名是 ...

  6. C++语言学习(十四)——C++类成员函数调用分析

    C++语言学习(十四)--C++类成员函数调用分析 一.C++成员函数 1.C++成员函数的编译 C++中的函数在编译时会根据命名空间.类.参数签名等信息进行重新命名,形成新的函数名.函数重命名的过程 ...

  7. c语言压缩文本文件北京理工大学,北京理工大学C语言程序设计第十二章文件.ppt...

    北京理工大学C语言程序设计第十二章文件 2000年1月25日 北京理工大学 / 第十二章 文件 第一节 文件概述 第二节 文件的处理 第三节 文件的顺序读写操作 第四节 文件的随机读写操作 第五节 文 ...

  8. Oracle入门(十四)之PL/SQL

    一.PL/SQL 基本语法 PL/SQL语言是模块式的过程化SQL,是oracle公司对SQL的扩展. (1) (2) (3) (5) (6) (7)数据类型 Number 数字型 Varchar2 ...

  9. go设置后端启动_Go语言基础(十四)

    Go语言基础(十四) 一.Redis 二.NSQ 三.Go module 四.Context......0 一.Redis Redis是一个key-value存储系统.和Memcached类似,它支持 ...

最新文章

  1. win10装linux分区格式化硬盘,windows10 下硬盘安装centos7.0 – MBR硬盘分区格式
  2. python断点调试不起作用flask_关于python的flask框架下的调试
  3. Java基础学习总结(7)——Object类
  4. 以Drools5.5为例说明“规则引擎在业务系统中应用”---起始篇
  5. Mysql8- Public Key Retrieval is not allowed
  6. NXP KW38开发杂记(一)MCUXpress 运行进入NMI_Handler
  7. 控制器对应view生命周期
  8. html5 本地文件操作系统,读取目录 - createReader《 HTML5:文件系统 》
  9. WAF(NGINX)中502和504的区别
  10. express的基本用法
  11. AC日记——向量点积计算 openjudge 1.6 09
  12. 【BZOJ3218】 a+b Problem
  13. 参加美赛能给计算机保研er带来些什么?
  14. 三星c5怎么改系统语言,三星c5驱动|三星c5手机驱动下载 v1.5.55.0 官方版 - 比克尔下载...
  15. grub4dos修改/制作message背景文件
  16. 你想要的宏基因组-微生物组知识全在这(1910)
  17. 百度小程序坐拥三大亿级流量入口 如何低成本制作百度小程序?
  18. 微型计算机内存为16m,微型计算机的内存为16M,指的是其内存容量为()。
  19. codeforces 133A(HQ9+) Java
  20. MySQL数据库表的插入,修改,删除操作实验

热门文章

  1. LNMP下提示File not found问题的解决方法
  2. 从物联网设备生命周期理解Apple Homekit框架
  3. ubuntu服务器在虚拟机中的配置
  4. 解决Ubuntu14.04 下 E: Encountered a section with no Package: header 问题
  5. Android 设置thumb图片大小
  6. 5. SQL Server数据库性能监控 - 当前请求
  7. 如何设置Winform控件的ClientRectangle
  8. Android 5.1 添加硬件抽象层(HAL)和JNI接口总结
  9. Windows Embedded Compact 2013升级:VS2013也能编译
  10. 基于WINCE6.0+S3C6410通过USB下载stepldr