地址

07 值传递和地址传递

拈花ヽ惹草 提交于 2020-02-20 23:48:20
1,C语言传递参数(或者赋值)可以是值传递,也可以传递指针,传递指针也叫地址传递 2,默认传递值的类型:基本数据类型(整型类型,小数类型,字符类型),结构体,共用体 默认传递地址的类型:指针,数组 3,值传递   ①将变量指向的存储内容,在传递/赋值时,拷贝一份给接收变量    4,地址传递   也叫指针传递,如果是指针,就将指针变量存储的地址,传递给接收变量,如果是数组,就将数组的首地址传递给接收变量    1 #include<stdio.h> 2 3 void main() { 4 int num = 10; 5 int* p = &num; //p指向num 6 int* p2 = p; //注意没有&,不是传递p的地址,而是传递p内存储的值即num的地址给p2,所以p2也执行num 7 *p2 = 5; //因为p2指向num,所以这里改变了num的值,num=5 8 9 printf("num=%d *p=%d *p2=%d\n", num, *p, *p2); 10 11 }    来源: https://www.cnblogs.com/shanlu0000/p/12337653.html

C语言内存小结

人盡茶涼 提交于 2020-02-20 13:05:12
学习C语言是了解内存布局的最简单、最直接、最有效的途径, 它比任何一门高级编程语言都贴近内存。以前学习C语言内存也有一段时间,却也是零零散散,于是打算写一篇博客,整理一下关于内存的内容。 内存优化小结: 计算机内存是以字节(Byte)为单位划分的,理论上CPU可以访问任意编号的字节,但是由于内存对齐(编译器的优化),情况就有所不同; CPU 通过地址总线来访问内存,一次能处理几个字节的数据,就命令地址总线读取几个字节的数据。32 位的 CPU 一次可以处理4个字节的数据,那么每次就从内存读取4个字节的数据,这就是意味着CPU读取的内存单元的标号一定是4的倍数;对于程序来说,一个变量最好位于一个寻址步长的范围内,这样一次就可以读取到变量的值;如果跨步长存储,就需要读取两次,然后再拼接数据,效率显然降低了。 例如一个 int 类型的数据,如果地址为 8,那么很好办,对编号为 8 的内存寻址一次就可以。如果编号为 10,就比较麻烦,CPU需要先对编号为 8 的内存寻址,读取4个字节,得到该数据的前半部分,然后再对编号为 12 的内存寻址,读取4个字节,得到该数据的后半部分,再将这两部分拼接起来,才能取得数据的值。 64位的处理器也是这个道理,同样的分析。 虚拟地址小结: 虚拟地址在寄存器层面是段地址+偏移地址,这两个地址通过内部总线传输到CPU的内部结构—

移动网络的基本原理

前提是你 提交于 2020-02-19 21:40:55
永久地址和转交地址 概述 移动网络简单来说就是在整个接入点不需要维持一直连接,所以使用移动网络的目的就是能保持终端到另一个地方之后还能了解上网,继续工作,这样就改变了我们传统的工作方式,但是也有一些新的问题出现,出现之后就得解决。 问题 1.不同的移动性需求 2.网络层地址保持不变的重要性 3.有线基础设施的支持 所以解决这些问题就得做一下工作。 寻址 永久地址和转交地址 相信我们每个人都用过网络,我们到他某个地方,所在的网络会给我们分配一个 Ip 地址,这个地址就是永久地址,如果通信者要和这个移动端通信的话,就是和这个永久地址建立通信,但是这个节点有可能发生移动,进入到另一个网络,进入到另一个网站之后,会给重新分配一个地址,使用新分配的那个 Ip 地址进行通信,这个网络就称为被访网络,获得的这个地址,我们称为转交地址。 为什么需要转交地址? 因为通信者始终是和永久地址进行通信的,这个移动节点改变了之后,通信者并不知道,通信者依然会把数据发送给归属网络,路由器里的路由表记录的就是归属网络,所以在归属网络中,需要一个归属代理,把接生的数据转发给新的网络中的路由器,这个路由器叫做外部代理,按照新的地址交给移动节点,想你的时候就直接发送给通信者。 二、移动节点的路由选择 1.简洁路由选择 由归属代理转发数据给外部代理 归属代理:到外部代理发送技术是通过隧道技术 2.直接路由选择

高地址,低地址:

妖精的绣舞 提交于 2020-02-19 18:45:38
高地址,低地址: 计算机中最基础的存储单位是字节(byte) 1 byte = 8 bit,00000000->11111111,表示范围[0,255] 对内存中的每一个字节(byte),都有一个索引编号,这就是传说中的 指针 ,也就是 地址 高低地址.png 很容易理解 高低地址 了吧,就是书写顺序 作者:随风而行之青衫磊落险峰行 链接:https://www.jianshu.com/p/c41741b5c19d 来源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 来源: https://www.cnblogs.com/mydriverc/p/12332426.html

大小端

六月ゝ 毕业季﹏ 提交于 2020-02-19 18:05:44
https://www.cnblogs.com/linux-bfbdxj520/p/11706973.html 存储模式: 小端:较高的有效字节存储在较高的存储器地址,较低的有效字节存储在较低的存储器地址。 大端:较高的有效字节存储在较低的存储器地址,较低的有效字节存储在较高的存储器地址。 STM32 属于小端模式,简单地说:比如:temp=0X12345678;假设temp的地址为:0X4000 0000 那么,在内存里面,其存储就变成了: | 地址 | HEX | |0X4000 0000 |78 56 43 12| 更为简单一点: 低地址---------->高地址【大端模式】: 0X12|0X34|0X56|0X78| 低地址---------->高地址【小端模式】: 0X78|0X56|0X34|0X12| 大端与小端的优势 二者无所谓优势,无所谓劣势,各自优势便是对方劣势 大端模式:符号位的判定固定为第一个字节,容易判断正负。 小端模式:强制转换数据不需要调整字节内容,1、2、4字节的存储方式一样 数组在大端小端情况下的存储: 以unsigned int value = 0x12345678为例, 分别看看在两种字节序下其存储情况, 我们可以用unsigned char buf[4]来表示value: Big-Endian: 低地址存放高位,如下: 高地址 ------

汇编学习笔记(1)基础知识

痞子三分冷 提交于 2020-02-19 08:57:24
本篇文章是汇编语言(王爽)一书的学习笔记,对应书中的第一章,基础知识。 简介 汇编语言,就是直接对硬件进行操作的语言,由机器语言发展而来。早期的程序员都是通过0和1组成的代码来控制计算机的行为,这种方式书写和维护成本巨大,一个hello world都是由几十行0和1组成,错把一个0写成1非常难遇排查,因此,汇编语言应运而生。 汇编语言把难以记忆的机器语言用接近自然语言的形式表现出来,便于书写和记忆,例如 将寄存器BX的内容送入AX中 机器语言:1000100111011000 汇编语言:mov ax,bx 显然,记住mov ax,bx要比0,1容易的多。可是,计算机只能识别0和1,必须通过一种方式把汇编语言翻译成计算机可以识别的机器语言,它就是编译器。它就像现实中的翻译官,把外国语言翻译成汉语。编译相关知识可以参考 编译原理 汇编语言主要由三部分组成 1.汇编指令:有对应的机器码,由计算机执行,例如mov 2.伪指令:没有对应的机器码,由编译器执行,为汇编代码编译时提供信息,累死C语言头文件 3.其他符号:+、-、/等 执行 CPU总是从内存中读取数据来执行,如果CPU是人类的大脑,内存就是大脑中的记忆。内存,是由很多存储单元组成,1个存储单元是1Byte,1Byte又等于8bit,即8个二进制位,也就是8个0或1。存储单元从0开始编号,如果有128个存储单元,编号就是0~127

Linux配置Docker镜像加速器

℡╲_俬逩灬. 提交于 2020-02-19 07:24:56
  Docker默认镜像为官方镜像,可以配置成国内加速器提高速度   登录阿里云控制台,搜索容器镜像服务获取到镜像加速服务地址   新建配置文件 /etc/docker/daemon.json   输入以下内容 { "registry-mirrors": ["镜像加速器地址"] }   PS:镜像加速器地址为获取到的地址,也可以是国内任意镜像加速器地址   重启docker服务即可 sudo systemctl daemon-reload sudo systemctl restart docker   PS:对Ubuntu和CentOS都适用 来源: https://www.cnblogs.com/minseo/p/11539775.html

STM32链接脚本详解

徘徊边缘 提交于 2020-02-18 19:31:38
程序的编译分为四个步骤:预处理、汇编、编译、链接。在开发STM32时,我们只要在IDE中点击编译就能一次性完成这4个步骤,实际上IDE也是要经过这些步骤的,只不过IDE为我们屏蔽了很多细节。 首先我们需要了解一个image文件的构成。image即编译的产物,我们编译STM32生成的bin文件此处称之为image。一个image文件由RO段和RW段组成,RO段包含只读的代码段和常量,RW段包含可读可写的全局变量和静态变量。因为程序刚运行时,RW段还在FLASH中,需要一段程序将这些变量复制到RAM中,STM32的启动文件的__main函数帮我们完成了这一动作。RW段中初始值为0的段为ZI段,image文件无需包含ZI段,因为ZI段包含的是全局或静态初始值为0的变量,只要在程序运行后,将对应的RAM区域清零即可。 这里又涉及到另一个概念:加载地址和运行地址。加载地址是指读取程序的地址,运行地址是指程序运行的入口地址。STM32因为有XIP(executed in place)技术,加载地址和运行地址是一样的,都是0x08000000。简而言之,如果程序在FLASH中运行,加载地址和运行地址是相同的,例如STM32等单片机;如果程序存放在FLASH里,而运行是在RAM里,那么加载地址指向FLASH,运行地址指向RAM,例如跑Linux系统的一些芯片。上面的RW段,其加载地址指向FLASH

C++(七)指针

蓝咒 提交于 2020-02-16 23:16:58
文章目录 一、地址与指针 定义指针及初始化 二级指针 二、指针与数组 字符指针与字符数组 三、指针与动态数组 new 分配内存 delete 释放内存 一、地址与指针 日常生活中我们会问一个人住在哪,比如小明家住在XX省XX市XX县XX镇XX村,这就是其详细住址,也就是地址。 那么在程序中定义的任何变量实际上都是存在内存中的,那么他们的具体位置是多少呢,这里就涉及到了地址。就是这个变量真正存在的位置。 下面我们用代码举个例子,例如定义一个字符: char ch = ‘a’; 我们用vs的监视窗口来看下字符 ch 的地址是多少呢? 那么在使用 cout << ch; 进行输出的时候,cout 也会去从 ch 的地址开始读取一个字符,之后打印输出出来。 变量的地址一般都是比较难记的,例如:0x007f2eab 之类的,那么能不能用专门的一个东西,或者说一种特殊类型的变量来保存这个地址呢?这个特殊类型的变量就是指针。 定义指针及初始化 int* p; //声明了一个指向int类型的指针,就在类型的后面加上一个*,代表是指针类型变量的意思。 但是他没有指向任何变量的地址。 # include "stdafx.h" # include <iostream> using namespace std ; int main ( ) { //定义的时候初始化 int a = 5 ; int *

第二次个人编程作业

你说的曾经没有我的故事 提交于 2020-02-15 21:23:37
这个作业属于哪个课程 软件工程 (福州大学至诚学院 - 计算机工程系) 这个作业要求在哪里 第二次个人编程作业 这个作业的目标 代码互改 作业正文 GitHub仓库地址 其他参考文献 “让我看看你的代码!” 查看至少10名其他同学的github仓库,阅读他/她的代码和博客,对于他/她代码中不符合题目需求,不符合编码规范,存在bug和优化问腿等,对其仓库提交issue。要求提出的问题或改进意见合理,提倡刻意找茬。 不允许水意见。 将自己对于10名同学提出的问题和建议记录在自己作业随笔,包括对方的github仓库地址,对其代码的问题和改进建议,提交issue的截图。 助教也会进行issue提交。 允许自提自改。 允许向其他人的仓库提交修改(pull request) “容我再改一改!” 若有别人对你自己的代码提出了issue,必须对其进行回复,必要时进行代码修改。 将别人对你的issue张贴到作业随笔中,并作出解释和自己的修改方法。 修改代码并提交到自己的仓库中。 “让我再看一看!” 对于采纳自己意见的,复查其代码,并记录在博客中。 对于不采纳自己意见的,可以谈谈为什么,如果想要可以对线。 “让我看看你的代码!” 由于我家前几天网络出现问题,所以完成作业比较晚,只能提出的问题比较重复 1. GitHub仓库地址 2. GitHub仓库地址 3. GitHub仓库地址 4.