《C和指针》笔记29:数组名和指针

2023-11-10

看下面的代码

int b[10];

b[4]的类型是整型,但b的类型又是什么?它所表示的又是什么?一个合乎逻辑的答案是它表示整个数组,但事实并非如此。在C中,在几乎所有使用数组名的表达式中,数组名的值是一个指针常量,也就是数组第1个元素的地址。它的类型取决于数组元素的类型:如果它们是int类型,那么数组名的类型就是“指向int的常量指针”;如果它们是其他类型 ,那么数组名的类型就是“指向其他类型 的常量指针”。

不要根据这个事实得出数组和指针是相同的结论。数组具有一些和指针完全不同的特征。例如,数组具有确定数量的元素,而指针只是一个标量值。编译器用数组名来记住这些属性。只有当数组名在表达式中使用时,编译器才会为它产生一个指针常量。

注意这个值是指针常量,而不是指针变量。你不能修改常量的值。你只要稍微回想一下,就会认为这个限制是合理的:指针常量所指向的是内存中数组的起始位置,如果修改这个指针常量,唯一可行的操作就是把整个数组移动到内存的其他位置。但是,在程序完成链接之后,内存中数组的位置是固定的,所以当程序运行时,再想移动数组就为时已晚了。因此,数组名的值是一个指针常量。

只有在两种场合下,数组名并不用指针常量来表示:

  1. 就是当数组名作为sizeof操作符或单目操作符&的操作数时。sizeof返回整个数组的长度,而不是指向数组的指针的长度。
  2. 取一个数组名的地址所产生的是一个指向数组的指针,而不是一个指向某个指针常量值的指针。
int a[10];
int *c;
c = &a[0];

表达式&a[0]是一个指向数组第1个元素的指针。但那正是数组名本身的值,如果数组名表示整个数组,这条语句就表示整个数组被复制到一个新的数组。但事实上完全不是这样,实际被赋值的是一个指针的拷贝,c所指向的是数组的第1个元素。所以下面这条赋值语句和上面那条赋值语句所执行的任务是完全一样的:

c = a;

像下面的语句是非法的:

b = a;

因为不能使用赋值符把一个数组的所有元素复制到另一个数组。必须使用一个循环,每次复制一个元素。

下面这条语句:

a = c;

c被声明为一个指针变量,这条语句看上去像是执行某种形式的指针赋值,把c的值复制给a。但这个赋值是非法的:记住!在这个表达式中,a的值是个常量,不能被修改。所以不能进行下面的操作:

a++;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

《C和指针》笔记29:数组名和指针 的相关文章

  • 在HTML5中有什么可以替代iFrame

    最佳解决方法 通常有4种方法可以将HTML嵌入到网页中 iframe的内容完全位于当前页面不同的上下文中 虽然这是一个很棒的功能 而且是不同浏览器版本之间兼容最好的 但是它也带来了额外的问题 将frame大小跟网页内容设置一致比较麻烦 AJ
  • C语言代码覆盖率测试工具-OpenCppCoverage介绍

    代码覆盖率测试工具名称 OpenCppCoverage 简介 OpenCppCoverage是2014年推出的Windows平台下开源的C 代码覆盖率工具 类似于Linux下gcc内嵌的gcov工具 它不需要在编译时插桩 只需要有编译生成的
  • 17.进程同步与死锁——信号量临界区保护

    1 温故知新 通过对信号量的访问和修改 让进程有序推进 问题 empty值必须是正确的 如果empty错了 就不能有序推进了 2 共同修改信号量引出的问题 生产者 Producer item P empty 生产者先判断 缓存区个数 emp
  • 富文本图片怎么上传_django上传图片到七牛云-富文本编辑器上传图片到七牛云...

    django创建项目 默认是保存资源到本地的 但是由于会占用太多的存储空间 对日后管理和升级不太友善 所以一般会把静态资源保存在第三方存储库里 这里 我们就是用到了七牛云 云存储 安装七牛云所需要的包 pip install django

随机推荐

  • 教你在M1芯片的imac一体机上安装PS2021 附教程和方法适用于所有Mac

    提示 文章转载自互联网 文章目录 前言 一 正确安装流程 二 注意事项 总结 前言 苹果在21年4月发布了搭载M1芯片的一体机产品 imac 2021 惊艳的机生设计和超薄的厚度实在是太香了 关键是性价比还算不错 详细大部分购买Imac的用
  • 4. 定时器(TIM)(定时器计数)

    1 TIM简介 TIM Timer 定时器 定时器可以对输入的时钟进行计数 并在计数值达到设定值时触发中断 16位计数器 预分频器 自动重装寄存器的时基单元 在72MHz计数时钟下可以实现最大59 65s 1 72 2 16 2 16 2
  • 多服务器分布式系统架构,集中式架构与分布式架构,你了解多少?

    原标题 集中式架构与分布式架构 你了解多少 什么是集中式 集中式架构就是将项目集中存储在中央服务器中 在工作的时候 大家只要自己电脑上操作 从同一个地方下载最新版本 然后开始工作 做完的工作再提交给中央服务器保存 这种方式需要联网 典型的例
  • 翻译:Apache Linkis Graduated to Apache Top-Level Project(Apache Linkis 升级为顶级项目)

    Apache Linkis是一个计算中间件 作为上层应用和底层引擎之间的一层 如Apache Spark Apache Hive和Apache Flink 它在2021年作为一个Apache孵化器项目开始 并在2023年1月升级为顶级项目
  • Spring Boot

    前言 什么是Spring Boot 为什么要学Spring Boot Spring 的诞 是为了简化Java 程序的开发的 Spring Boot 的诞 是为了简化Spring 程序开发 的 Spring就像汽车 相比以前人只能其自行车走路
  • CGAL 使用Voronoi协方差估计点云的法线

    目录 一 算法原理 1 主要函数 二 代码实现 一 算法原理 1 主要函数 头文件 include
  • IO多路复用之select、poll、epoll

    五种网络I O模型 如果使用多进程 多线程模式的话 创建进程和创建线程需要时间开销 在编写服务器客户端程序时 如果服务器性能不行而客户端太多时这种代价很大 试想如果有一种方法能够同时监听按键设备 串口设备和网络socket的事件 可读 可写
  • 【Python零基础入门篇 · 11】:类型转换和深浅拷贝,可变对象和不可变对象、pass语句

    文章目录 int float str repr eval的类型转换 list str tuple三者的类型相互转换 深浅拷贝 浅拷贝 数据半共享 深拷贝 数据完全不共享 可变对象和不可变对象 可变对象 不可变对象 pass语句 int fl
  • HDMI和DP线的等级和速度

    转自 4K 144Hz到底需要多少带宽
  • Unity3D的GetComponent<>()

    GetComponent 是Unity游戏引擎中的一个函数 用于获取游戏对象上附加的组件 在Unity中 游戏对象可以添加各种不同的组件来实现不同的功能 比如 Transform组件用于控制游戏对象的位置 旋转和缩放 Renderer组件用
  • C++实验: 运算符重载

    C 实验 运算符重载 1 实验目的 1 进一步了解运算符重载的概念与使用方法 2 掌握几种常用的运算符重载方法 3 了解转换构造函数的使用方法 4 了解在Visual C 6 0环境下进行运算符重载要注意的问题 2 实验内容 1 声明一个复
  • NET Core 3.0 AutoFac替换内置DI的新姿势

    NET Core 3 0 和 以往版本不同 替换AutoFac服务的方式有了一定的变化 在尝试着升级项目的时候出现了一些问题 原来在NET Core 2 1时候 AutoFac返回一个 IServiceProvider 参数注入到Confi
  • 剖析top命令显示的VIRT RES SHR值

    http yalung929 blog 163 com blog static 203898225201212981731971 http www fuzhijie me p 741 引 言 top命令作为Linux下最常用的性能分析工具之
  • 自然语言处理基础

    以下所有内容来自 自然语言处理 基于预训练模型的方法 1 文本的表示 利用计算机对自然语言进行处理 首先要解决语言在计算机内部的存储和计算问题 使用字符串表示计算文本的语义信息的时候 往往使用基于规则的方法 如 判断一个句子编译还是褒义 规
  • ninja: error: ‘system/bt/EventLogTags.logtags‘, needed by ‘out/target/common/obj/all-event-log-tags.

    项目场景 编译环境 ubuntu18 04 软件版本 全志SDK 安卓版本8 1 0 linux 4 9 0 问题描述 编译SDK时遇到这个问题 97 43 44 glob device Android bp ninja error sys
  • (HTML5)第一章

    HTML5秘籍 第一部分适合浏览器升级时参考 参考网址 H5API https github com Modernizr Modernizr wiki HTML5 Cross browser Polyfills 书本案例 http www
  • vue el-input表单验证禁止输入空格

    element ui 中自带的表单必填项校验输入空格时 依然能逃过验证 required true还是可以通过 需要再 在v model 加上 trim 来禁止输入空格字符 加上之后则不能输入空格
  • 唐老师讲运算放大器(第五讲)——运放的应用

    一 常见运放的应用 二 运放用于电源降压 图示的D1为2 5V稳压管 若VIN 12V 那么运放的同相输入端为2 5V 又虚短可知 反向输入端的电压也为2 5V 那么Rfb2和Rfb1中间节点的电压为2 5V 此时 有运算放大器的性质可知
  • 知识蒸馏 (一) 综述

    一 综述 Knowledge Distillation A Survey 2021 IJCV Knowledge Distillation and Student Teacher Learning for Visual Intelligen
  • 《C和指针》笔记29:数组名和指针

    看下面的代码 int b 10 b 4 的类型是整型 但b的类型又是什么 它所表示的又是什么 一个合乎逻辑的答案是它表示整个数组 但事实并非如此 在C中 在几乎所有使用数组名的表达式中 数组名的值是一个指针常量 也就是数组第1个元素的地址