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

2023-09-20 23:51:55

看下面的代码

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++;
更多推荐

漫谈:C语言 C++ 迷惑的语句、分号、大括号

C语言设计得很麻拐。初学者经常面临这样的麻烦:多了一个分号,if条件没通过却执行了少了一个分号,编译不下去,报奇怪的错误if(a>0);++x;这个代码的“++x”无论如何都会被执行,旁观者很快就能看出来是因为if语句后面多了一个分号。structA{inta;}这个代码会导致其后的代码(甚至是另外一个文件,取决于头文

人工智能术语翻译(六)

文章目录摘要UVWXYZ摘要人工智能术语翻译第六部分,包括U、V、W、X、Y、Z开头的词汇!U英文术语中文翻译常用缩写备注UglyDucklingTheorem丑小鸭定理Unbiased无偏UnbiasedEstimate无偏估计UnbiasedSampleVariance无偏样本方差UnconstrainedOpti

Wi-Fi7将带来前所未有的快捷、稳定的互联网,更快的传输速度

随着科技的飞速发展,无线连接技术也日渐成熟与先进。Wi-Fi,作为我们日常生活和工作中不可或缺的一部分,也正在迎来技术的革新。我们将有机会见识到新一代的Wi-Fi技术--Wi-Fi7,它将带来前所未有的快捷、稳定的互联网体验。首先,Wi-Fi7将会为我们带来更快的传输速度。预计新一代Wi-Fi(Wi-Fi7)的最高理论

快速入门:如何使用HTTP代理进行网络请求

今天我要和大家分享如何使用HTTP代理进行网络请求的快速入门指南。如果你想了解如何通过代理服务器发送和接收网络请求,那么这篇文章将为你提供一个简单而全面的指南。第一部分:HTTP代理的基础知识HTTP代理服务器充当了客户端和目标服务器之间的中间人角色。当你发送网络请求时,请求首先发送到代理服务器,然后由代理服务器将请求

基于Xml方法的Bean的配置-实例化Bean的方法-构造方法

SpringBean的配置详解Bean的实例化配置Spring的实例化方法主要由以下两种构造方法实例化底层通过构造方法对bean进行实例化构造方法实例化bean又分为无参方法实例化和有参方法实例化,在Spring中配置的<bean>几乎都是无参构造该方式,默认是无参构造方法,在此处不赘述。下面讲解有参构造方法实例化Be

Mybatis的mapper.xml批量插入、修改sql

今天要有个功能,要进行一批数据的插入和修改,为了不频繁调用数据库,所以想到了批量插入和修改,因为从毕业后,就没写过批量插入和批量修改,所以在这里记录一下,避免后续再遇到忘记怎么写了批量插入(传入的参数是List<实体>list):<insertid="insertList"keyColumn="id"keyProper

【Spring Boot】专栏合集,快速入门大全

作者简介前言作者之前写过一个SpringBoot的系列,包含自动装配原理、MVC、安全、监控、集成数据库、集成Redis、日志、定时任务、异步任务等内容,本文将会一文拉通来总结这所有内容,不骗人,一文快速入门SpringBoot。专栏地址:https://blog.csdn.net/joker_zjn/category

优化系统报错提示信息,提高人机交互(一)

1、常规报错及处理packagecom.example.demo.controller;importcom.example.demo.service.IDemoService;importlombok.AllArgsConstructor;importlombok.extern.slf4j.Slf4j;importor

XAPI项目架构:应对第三方签名认证的设计与调整

《XAPI项目》:GitHub仓库(勿打🚫小破站一个)该项目是基于鱼皮的《API开发平台》项目的需求和架构设计上进行Golang版本开发的。这篇文章,主要内容是记录在《XAPI项目》的原架构上,为了应对第三方签名认证的设计,而对原架构的调整修改。目录原设计架构遇到的问题:当【第三方项目】需要验证自己项目的签名认证时,

“全景江西·南昌专场”数字技术应用场景发布会 | 万广明市长莅临拓世集团展位,一览AIGC科技魅力

随着数字技术的迅猛发展,传统产业正在发生深刻的变革,新兴产业蓬勃兴起。但要想实现数字经济超常规发展,就要在数字产业化上培育新优势,大力实施数字经济核心产业提速行动,加快推进“一核三基地”建设。在这个数字经济时代,创新和科技成为了推动社会进步的关键力量。数字经济的崛起也意味着更多的机会和挑战。它不仅为企业提供了更多创新和

【微信小程序】文章样式,标题样式,及设置背景~

|background-size设置背景图片大小。图片可以保有其原有的尺寸,或者拉伸到新的尺寸,或者在保持其原有比例的同时缩放到元素的可用空间的尺寸。|background-size:cover;适配屏幕大小文章样式,标题样式,及设置背景~index.wxml<viewclass="about"><viewclass=

热文推荐