一切皆为地址

C语言用变量来存储数据,用函数来定义一段功能代码,它们最终都要放到内存中供 CPU 调用。

数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据。

CPU访问内存时需要的是地址,而不是变量名或函数名。程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。

何为指针

计算机中所有的数据都必须放在内存中,不同类型的数据占用的字节数不一样,例如 int 占用 4 个字节,char 占用 1 个字节。为了正确地访问这些数据,必须为每个字节都编上号码,就像门牌号、身份证号一样,每个字节的编号是唯一的,根据编号可以准确地找到某个字节。这个编号就是指针(Pointer)。

也就是说,指针是一个变量,其值为另一个变量的地址(Address),即变量在内存中字节的编号。

指针变量的声明

与其他变量或常量一样,在使用指针存储其他变量地址之前,需对其进行声明。指针变量声明的一般形式为:

type *var_name;

其中 type 是指针的类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。

如下图所示,x是一个整型变量,其值为8,p是一个整型指针,指向x。使用&操作符取得变量x的地址,将其赋给p,从而使p指向变量x的地址;使用*操作符即可访问该地址存储的变量值。

用来声明指针的星号 * 与乘法所使用的星号是相同的。但在这里,星号是用来声明这个变量是指针。

char *pc; /* 一个字符型指针 */

int *pi; /* 一个整型指针 */

float *pf; /* 一个浮点型指针 */

double *pd; /* 一个 double 型指针 */

指针变量的大小

在32位计算机中,一个指针变量所占的字节数通常是4,在64位系统中通常为8。

如下图所示,在64位机器上,指针变量所占的字节数都是8。

sizeof是C/C++中的一个操作符(operator),其作用是返回一个对象或者类型所占的内存字节数。

c语言 指针_初识C语言指针相关推荐

  1. C语言入门(初识C语言)

    C语言入门(初识C语言) 前言 什么是C语言? 为什么选择C语言? 计算机语言的发展 高级计算机语言中的经典:C语言 初识C语言(正片开始) 一.第一个C语言程序(你好,C语言) 1.1 #inclu ...

  2. 二维数组的传参【01_数组指针_指向数组的指针】

    2021-04-08 二维数组的传参[01_数组指针_指向数组的指针] #include <stdio.h> #include <stdint.h> #include < ...

  3. c++ 非空指针 写入访问权限冲突_初识C语言指针

    一切皆为地址 C语言用变量来存储数据,用函数来定义一段功能代码,它们最终都要放到内存中供 CPU 调用. 数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存存储的是数据还是代码.当 ...

  4. C语言初阶_初识C语言(1)

    凡是过往,皆为序章 期末考试结束了,真是感慨良多啊...... C语言编程题大家都做对了多少呢? 不管怎么样,都已经过去了.不管你学得怎么样,都可以在接下来的时间里,我们一起重新回顾一遍C语言初阶的知 ...

  5. C语言基础01——初识C语言

    目录 什么是C语言 第一个C语言程序:HelloWorld 初识数据类型 初识常量.变量 初始字符串.转义字符.注释 初识选择语句.循环语句 初识函数.数组 初识关键字 定义常量和宏 格式化输入输出 ...

  6. GO语言-第一节-初识Go语言

    目录 1.1 语言简史 1.2 语言特性 1.2.1 自动垃圾回收 1.2.2 更丰富的内置类型 1.2.3 函数多返回值 1.2.4 错误处理 1.2.5 匿名函数和闭包 1.2.7 并发编程 1. ...

  7. c语言编译器_学C语言写自己的K语言:编译器词法分析。

    词法分析(lexical analysis),是计算机科学中将字符序列转换为记录(Token)序列化的过程.词法分析一般分手动与自动,自动是基于lex,flex词法分析器使用正则式来配置,我们这里将学 ...

  8. python 为什么动态语言图片_聊聊动态语言那些事(Python)

    动态编程语言是高级程序设计语言的一个类别,在计算机科学领域已被广泛应用.它是一类在运行时可以改变其结构的语言:例如新的函数.对象.甚至代码可以被引进,已有的函数可以被删除或是其他结构上的变化.动态语言 ...

  9. c++ 函数指针_进化论——从函数指针到被结构封装的函数指针及参数的应用举例...

    ↑↑↑ 点击上方公众号名称关注,不放过任何转变的机会. ✎ 编 者 悟 语 借口再小也会瓦解人的意志. 文 章 导 读 今天带大家用下函数指针,然后将函数指针和函数参数封装到结构体中,接着将数据用动态 ...

最新文章

  1. 【计算机视觉】背景建模之PBAS
  2. 用神经网络解释化学键能 化学键的键能:一个方程组的特征解
  3. IDOC实例, Inbound IDOC
  4. flask渲染图像_用于图像推荐的Flask应用
  5. SharePoint 2010多语言UI,以及开发人员需要注意的
  6. string与string.h的区别
  7. 自定义评分器Similarity,提高搜索体验(转)
  8. EXP-00011: XX.tab does not exist
  9. Hibernate中的sql的所有的查询
  10. [设计模式-结构型]代理模式(Proxy)
  11. 洛谷 P3807 【模板】卢卡斯定理
  12. 【LaTeX】对表格中的内容添加脚注不显示
  13. TARA-基于J3061的概念阶段流程
  14. Flutter Convex Bottom 底部导航
  15. 小游戏流量变现瓶颈,新增长点是超级App?
  16. 教你如何发布自己的网站
  17. Golang开发环境LiteIDE的设置
  18. 如意云路由刷PandoraBox
  19. 论文复现_1:Chinese NER Using Lattice LSTM
  20. 【数据库系统概念第七版(Database System Concepts 7th)配套SQL文件如何获取】

热门文章

  1. 周末项目:使用scikit-learn进行手语和静态手势识别
  2. SpringBoot-视图解析与模板引擎
  3. Spark 的核心 RDD 以及 Stage 划分细节,运行模式总结
  4. Python中dir,hasattr,getattr,setattr,vars的使用
  5. [转]撞车之后,不要傻里傻气的!这里有绝招!
  6. Visual Studio 2008下AJAX的设置
  7. 王道 —— 进程同步、进程互斥
  8. leetcode - 343. 整数拆分
  9. 数据积分-牛顿科茨法与高斯勒让德法对比及示例
  10. 图像傅里叶变换的频率怎么理解?【转载】