当前位置: 首页 > article >正文

《C和指针》(6)指针

问题

  1. 如果一个值的类型无法简单地通过观察它的位模式来判断,那么机器是如何知道应该怎样对这个值进行操纵的?

    :机器无法作出判断。编译器根据值的声明类型创建适当的指令,机器只是盲目地执行这些
    指令而已。

  2. C为什么没有一种方法来声明字面值指针常量呢?

    :它们很少被使用,因为你无法提前判断编译器将把变量放在哪里。

  3. .假定一个整数的值是244。为什么机器不会把这个值解释为一个内存地址呢?

    :该值是一个整数,因此编译器不会生成取消引用它的指令

  4. 在有些机器上,编译器在内存位置零存储0这个值。对NULL指针进行解引用操作将访问这个位置。这种方法会产生什么后果?

    :这是很危险的。首先,解引用一个NULL指针的结果因编译器而异,所以程序不应该这样做。允许程序在这样的访问之后还能继续运行是很不幸的,因为这时程序很可能并没有正确运行。

  5. 表达式(a)和(b)的求值过程有没有区别?如果有的话,区别在哪里?假定变量offset的值为3。

    · 在这里插入图片描述

    :即使偏移量与下一个表达式中的文字值相同,计算第一个表达式也会更耗时,因为必须在运行时进行将偏移量缩放为整数大小的乘法运算。这是因为变量可能包含任何值,编译器无法提前知道实际值。另一方面,可以在编译时将文字3乘以整数,然后在运行时将相乘的结果简单地添加到p。换句话说,第二个表达式可以通过简单地在p上加12来实现(在具有四字节整数的机器上);不需要运行时乘法。

  6. .下面的代码段有没有问题?如果有的话,问题在哪里?
    在这里插入图片描述
    :有两个错误。对增值后的指针进行解引用时,数组的第1个元素并没有被清零。另外,指针在越过数组的右边界以后仍然进行解引用,它将把其他某个内存地址的内容清零。
    注意pi在数组之后立即声明。如果编译器恰好把它放在紧跟数组后面的内存位置,结果将是灾难性的。当指针移到数组后面的那个内存位置时,那个最后被清零的内存内置就是保存指针的位置。这个指针(现在变成了零)因此仍然小于&array[ARRAY-SIZE],所以循加将继续执行。指针在它被解引用之前增值,所以下一个被破坏的值就是存储于内存位置4的变量(假定整数的长度为4个字节)。如果硬件并没有捕捉到这个错误并终止程序,这个循环将快乐地继续下去,指针在内存中欢快地前行,破坏它遇见的所有值0当它再一次到达这个数组的位置时,就会重复上面这个过程,从而导致一个微妙的无限循环。


http://www.kler.cn/a/108716.html

相关文章:

  • docker运行ActiveMQ-Artemis
  • Nginx中实现流量控制(限制给定时间内HTTP请求的数量)示例
  • Java复习42(PTA)
  • MicroPythonBLEHID使用说明——蓝牙鼠标
  • 【go从零单排】Mutexes互斥锁
  • 如何在 Ubuntu 16.04 上设置 NFS 挂载
  • JAVA面试题简单整理
  • php使用lunar实现农历、阳历、节日等功能
  • SpringBoot小项目——简单的小区物业后台管理系统 认证鉴权 用户-角色模型 AOP切面日志 全局异常【源码】
  • 云原生微服务治理 第四章 Spring Cloud Netflix 服务注册/发现组件Eureka
  • 【C++项目】高并发内存池第五讲内存回收释放过程介绍
  • 如何利用 ChatGPT 提升编程技能
  • RabbitMQ生产者的可靠性
  • 洛谷 B2029 大象喝水 C++代码
  • pandas笔记
  • spring-aop-execution表达式
  • vue3.0运行npm run dev 报错Cannot find module node:url
  • 文心一言 VS 讯飞星火 VS chatgpt (123)-- 算法导论10.4 4题
  • Java SE 学习笔记(十七)—— 单元测试、反射
  • POJ 1201 Intervals 线段树
  • 微信小程序之投票管理
  • Leetcode—274.H指数【中等】
  • Java 四种引用类型
  • 【网络协议】聊聊TCP如何做到可靠传输的
  • redis 常用方法
  • 71 搜索二维矩阵