C语言语义缺陷(一)

前言

        在一个句子,哪怕其中的每个单词都拼写正确,而且语法也无懈可击,仍然可能有歧义或者并非书写者希望表达的意思。程序也有可能表面上是一个意思,而实际上的意思却相差甚远。本篇讲述了几种可能引起上述歧义的程序书写方式

1、指针与数组

C语言中,指针与数组这两个概念之间的联系是十分密切的

C语言中的数组有两个需要注意的方面:

1、C语言中只有一维数组,而且数组大小在声明数组时就需要确定下来,不过数组中的元素可以是任何类型的对象,当然也可以是另外一个数组,这样要”仿真“出一个多维数组就不是一件难事

C99标准允许变长数组(VLA),GCC编译器中实现了变长数组,但细节与C99标准不完全一致

2、对于一个数组,我们只能做两件事:确定该数组的大小以及获得指向该数组首元素(下标为零)的指针其它有关数组的操作,哪怕它们乍看上去是以数组下标进行运算的,实际上都是通过指针进行的。换句话说,任何一个数组下标运算都等同于一个对应的指针运算,因此我们完全可以依据指针行为定义数组下标的行为。

指针与数组的关系

        1、如果一个指针指向的是数组中的第一个元素,那么我们只要给这个指针加/减1,就能够得到指向该数组中下/上一个元素的指针,其它数字同理类推

        这句话暗示了这样一个事实:给一个指针加上一个整数,与给该指针的二进制表示加上同样的整数,二者的含义截然不同。如果指针ip指向一个整数,那么ip+1指向的是该计算机内存中的下一个整数,在大多数现代计算机中,它都不同于ip所指向地址的下一个内存位置

2、如果两个指针指向同一数组中的元素,这两个指针相减的结果是有意义的:

int *q = p + i;

p指针与q指针的差值就是两指针指向的元素之间的位置的差值(意思是这个意思) ,但是如果它们指向的不是同一个数组,那么即使它们所指向的地址在内存中的位置正好间隔一个数组元素的整数倍,所得的结果仍然无法保证其正确性

3、如果我们在该出现指针的地方,采用了数组名代替,数组名就是该数组首元素的地址:

//正确,将数组a中下标为0的元素的地址赋值给了指针p
p = a
//错误
p = &a

 p=&a这种写法在ANSI C标准中是非法的,因为&a是一个指向数组的指针此时取出的地址是整个数组的地址而非数组首元素的地址,而p是一个指向整型变量(数组中某个整型元素)的指针,它们的类型不匹配。

4、p是一个指向数组的指针,p = p + 1 == p++

5、*数组名,此时的数组名表示数组首元素地址,该语句可以将数组首元素的值替换

*a = 84;

它等价于*(a+0),同理,*(a+1)是数组a中下标为1的元素的引用,依次类推。概而言之,*(a+i)即数组a中下标为i的元素的引用,由于这种写法十分常用,所以C语言将它变为了另一种形式a[i],

a[i] == *(a+i)
~未完待续~

2、非数组的指针

3、作为参数的数组声明

4、避免”穷隅法“

5、空指针并非空字符串

~over~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/203089.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker+jenkins+gitlab实现持续集成

1.安装环境 服务器ip虚拟机版本192.168.5.132centos7.6192.168.5.152centos7.6 2. 安装docker 安装必要的一些系统工具 yum install -y yum-utils device-mapper-persistent-data lvm2添加软件源信息,要确保centos7能上外网 yum-config-manager --add-repo http:…

Flask 请求的生命周期

一、请求生命周期 Flask 请求的生命周期涉及到整个处理请求的过程,包括请求的接收、视图函数的执行、响应的生成和发送等。以下是一个简要的 Flask 请求生命周期的概述: WSGI 服务器调用 Flask 对象,该对象调用 Flask.wsgi_app() 。 一个 R…

windows如何解决端口冲突(实用篇)

在项目设计中,环境配置成功点击运行瞬间,一大堆红爆出,8080端口占用,这个是很烦人的。。。 解决方式: 笨方法:一、查看所有端口实用情况(挨个扫) 按住【WINR】快捷键打开运行输入…

处理实时视频流:第三方美颜SDK的实时图像处理策略

为了提高用户体验,许多应用和平台开始采用第三方美颜SDK,通过先进的图像处理技术实时改善视频中的面部外观。本文将深入探讨这些第三方美颜SDK在实时视频流处理中所采用的图像处理策略,揭示其背后的技术原理和创新。 一、引言 实时视频流处理…

P6 Linux 系统中的文件类型

目录 前言 ​编辑 01 linux系统查看文件类型 02 普通文件 - 03 目录文件 d 04 字符设备文件 c 和块设备文件 b 05 符号链接文件 l 06 管道文件 p 07 套接字文件 s 总结 前言 🎬 个人…

微信小程序中全局变量的应用

为什么要使用全局变量的应用呢,例如在播放音乐的时候,我们跳转到其他的页面上,那我们当前的音乐是否要继续播放呢????所以我们就使用到了全局变量的应用。 在微信小程序中,可以通过…

在cmd下查看当前python的版本

在cmd窗口下运行python --version或者py --version,可以查看当前python的版本。例如:

Android 10.0 SystemUI定制之通过系统属性控制锁屏页面通知栏显示与隐藏功能实现

1.前言 在10.0的系统产品开发中,在一些SystemUI的系统定制化开发中,在对锁屏页面的通知栏在某些情况下不需要显示通知栏,所以就需要 在systemui的通知栏布局页面中,通过属性来控制是否在锁屏页面的时候显示通知,具体就分析下systemui然后开发相关功能 2.SystemUI定制之通…

unity 2d 入门 飞翔小鸟 飞翔脚本(五)

新建c#脚本 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Fly : MonoBehaviour {//获取小鸟(刚体)private Rigidbody2D bird;//速度public float speed;// Start is called before the first frame up…

配置和管理VLAN

VLAN技术是交换技术的重要组成部分,也是交换机配置的基础。用于把物理上直接相连的网络从逻辑上划分为多个子网。 每一个VLAN 对应一个广播域,处于不同VLAN 上的主机不能通信。 不同VLAN 之间通信需要引入三层交换技术。 对性能局域网的配置和管理主要…

H5ke13-1浏览器处理异常

window对应的error没有event对象 window对应的error他接收三个参数,msg,url,行号 return false return true 1就不会返回错误 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><title>Title</title>&…

7-tornado中Url设置、RequestHandler的使用、重定向 RedirectHandler、静态文件 StaticFileHandler

1 URL设置 url地址可以如下操作&#xff1a; 1. 完整匹配&#xff0c;跳转控制器 2. 通过re匹配&#xff0c;跳转控制器 3. 通url传递参数 4. 跳转 4.1 url 反转 使用web.URLSpec中的name属性&#xff0c;在处理函数中使用reverse_url from tornado import web,ioloopclass I…

【PyTorch】训练过程可视化

文章目录 1. 训练过程中的可视化1.1. alive_progress1.2. rich.progress 2. 训练结束后的可视化2.1. tensorboardX2.1.1. 安装2.1.2. 使用 1. 训练过程中的可视化 主要是监控训练的进度。 1.1. alive_progress 安装 pip install alive_progress使用 from alive_progress i…

提取B站视频

1、将视频链接粘贴到下面的网站&#xff0c;下载视频到本地。 贝贝BiliBili - B站视频下载 2、使用剪映打开视频&#xff0c;导入视频&#xff0c;导出字幕文件SRT 剪映专业版-全能易用的桌面端剪辑软件-轻而易剪 上演大幕 3、上传SRT文件&#xff0c;解析出来即可 it365 字…

【 Go语言操作MongoDB时候的bson类型】

Go语言操作MongoDB时候的bson类型 在 MongoDB 中&#xff0c;bson&#xff08;Binary JSON&#xff09;是一种二进制编码的文档格式&#xff0c;用于在 MongoDB 和应用程序之间交换数据。bson.D、bson.M、bson.E 和 bson.A 都是 bson 包中的类型&#xff0c;用于处理和操作 bs…

Redis key过期删除机制实现分析

文章目录 前言Redis key过期淘汰机制惰性删除机制定时扫描删除机制 前言 当我们创建Redis key时&#xff0c;可以通过expire命令指定key的过期时间(TTL)&#xff0c;当超过指定的TTL时间后&#xff0c;key将会失效。 那么当key失效后&#xff0c;Redis会立刻将其删除么&#…

wsl2 ubuntu下配置go执行make init 错误 /bin/bash line 1 go command not found

我原来的配置是将www设置在mnt/d/www/goland export GOPATH/mnt/d/www/goland export GOROOT/usr/local/go export PATH$PATH:$GOROOT/bin:$GOPATH/bin后面改为了下面这样&#xff0c;然后重新拉取了项目&#xff0c;就可以了。 export GOPATH/home/用户名/go export GOROOT/…

设置webstorm和idea符合Alibaba规范

只格式化自己更改的代码 ctrlShiftAltL 插件建议 Alibaba Java Coding Guidelines&#xff08;新版本的idea不支持&#xff0c;有其他同名的非官方版可代替&#xff09;&#xff0c;使用方法在此不赘述 1、设置webstorm 包含 设置两个空格缩进&#xff0c;去掉行尾分号&#…

uniapp定时器的应用

1、初始化定时器 data(){return{timer: null, //定时器} } 2、定时器的使用 定时器分两种&#xff0c;setInterval和setTimeout。 二者的区别&#xff1a; setInterval函数会无限执行下去&#xff0c;除非调用clearInterval函数来停止它。setTimeout函数只执行一次&#x…

HarmonyOS/OpenHarmony应用开发-Stage模型应用/组件级配置

在开发应用时&#xff0c;需要配置应用的一些标签&#xff0c;例如应用的包名、图标等标识特征的属性。本文描述了在开发应用需要配置的一些关键标签。图标和标签通常一起配置&#xff0c;可以分为应用图标、应用标签和入口图标、入口标签&#xff0c;分别对应app.json5配置文件…