为您推荐:
精华内容
最热下载
问答
  • 5星
    25MB u010575833 2021-08-28 16:07:13
  • 5星
    20.16MB weixin_44573410 2021-02-10 14:45:56
  • 5星
    220KB weixin_48465965 2021-08-07 15:58:07
  • 5星
    866B qq_33064191 2021-08-16 14:35:51
  • 5星
    464KB SKCQTGZX 2021-09-03 15:04:56
  • 5星
    75B weixin_38907948 2021-07-15 20:38:37
  • 5星
    2.61MB u011092458 2021-06-29 06:48:04
  • 5星
    36.9MB Johnho130 2021-03-28 18:18:13
  • 本题要求编写程序,先将输入的一系列整数中的最小值第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。 注意:题目保证最大和最小值都是唯一的。 输入格式: 输入在第一行中给出一个正整数N(≤...

    本题要求编写程序,先将输入的一系列整数中的最小值与第一个数交换,然后将最大值与最后一个数交换,最后输出交换后的序列。

    注意:题目保证最大和最小值都是唯一的。

    输入格式:
    输入在第一行中给出一个正整数N(≤10),第二行给出N个整数,数字间以空格分隔。

    输出格式:
    在一行中顺序输出交换后的序列,每个整数后跟一个空格。

    输入样例:
    5
    8 2 5 1 4
    输出样例:
    1 2 5 4 8

    #include <stdio.h>
    int main() {
        int i, j = 0, m = 0, n, k[11], min, max, p;
        scanf("%d", &n);
        for (i = 0; i < n; i++) {
            scanf("%d", &k[i]);
        }
    
        min = k[0];               //最小值
        for (i = 1; i < n; i++) { //得到最小值
            if (k[i] < min) {
                m = i;
                min = k[i];
            }
        }
    
        p = k[0]; //最小值与第一个数交换
        k[0] = min;
        k[m] = p;
    
        max = k[0];               //最大值
        for (i = 1; i < n; i++) { //得到最大值
            if (k[i] > max) {
                j = i;
                max = k[i];
            }
        }
    
        p = k[n - 1]; //最大值与最后一个数交换
        k[n - 1] = max;
        k[j] = p;
    
        for (i = 0; i < n; i++) {
            printf("%d ", k[i]);
        }
    }
    
    展开全文
    xcdq_aaa 2019-11-05 21:58:45
  • 1.问题描述 已知p指向双向循环链表中的...知道双向循环链表中的一个结点,前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。 void Change(LinkList p) { DLnode *q; q = p->...

    1.问题描述

    • 已知p指向双向循环链表中的一个结点,其结点结构为data、prior、next三个域,写出算法change(p),交换p所指向的结点和它的前缀结点的顺序。

    2.问题分析

    • 知道双向循环链表中的一个结点,与前驱交换涉及到四个结点(p结点,前驱结点,前驱的前驱结点,后继结点)六条链。
    void Change(LinkList p) 
    {
    	DLnode *q;
    	q = p->prior;
    	
    	q->prior->next = p;          // p的前驱的前驱之后继为p
    	p->prior = q->prior;    // p的前驱指向其前驱的前驱。
    	
    	q->next = p->next;    // p的前驱的后继为p的后继。 
    	p->next->prior = q;   // p的后继的前驱指向原p的前驱
    	
    	q->prior = p;     // p与其前驱交换
    	p->next = q;    // p的后继指向其原来的前驱
    }

    3.代码实现

    • main.cpp
    #include<iostream>
    
    using namespace std;
    
    typedef struct DLnode 
    {
    	int data;
    	struct DLnode *prior;
    	struct DLnode *next;
    }DLnode, *LinkList;
    
    int InitList(LinkList &L) 
    {
    	L = new DLnode;
    	L->next = L;
    	L->prior = L;
    	return 1;
    }
    
    void TraveList(LinkList L) 
    {
    	DLnode *p;
    	p = L->next;
    	
    	while (p != L) 
    	{
    		printf("%d ", p->data);
    		p = p->next;
    	}
    	
    	printf("\n");
    }
    
    int ListLength(LinkList &L) 
    {
    	DLnode *p;
    	p = L->next;
    	int length = 0;
    	while (p!=L) 
    	{
    		length++;
    		p = p->next;
    	}
    	
    	return length;
    }
    
    void CreateList(LinkList &L, int &n) 
    {
    	L = new DLnode;
    	L->next = L;
    	L->prior = L;
    	DLnode *p;
    	p = L;
    	
    	for (int i = 0; i < n; i++) 
    	{
    		printf("请输入第%d个元素的值:", i + 1);
    		DLnode *s;
    		s = new DLnode;
    		scanf("%d", &s->data);
    		p->next = s;
    		s->next = L;
    		s->prior = p;
    		p = s;
    	}
    }
    
    void Change(LinkList p) 
    {
    	DLnode *q;
    	q = p->prior;
    	
    	q->prior->next = p;          // p的前驱的前驱之后继为p
    	p->prior = q->prior;    // p的前驱指向其前驱的前驱。
    	
    	q->next = p->next;    // p的前驱的后继为p的后继。 
    	p->next->prior = q;   // p的后继的前驱指向原p的前驱
    	
    	q->prior = p;     // p与其前驱交换
    	p->next = q;    // p的后继指向其原来的前驱
    }
    
    int main() 
    {
    	LinkList L;
    	
    	if (InitList(L)) 
    	{
    		printf("L初始化成功\n");
    	}
    	else 
    	{
    		printf("L初始化失败.\n");
    	}
    
    	printf("请输入链表元素个数:");
    	int n;
    	scanf("%d", &n);
    	CreateList(L, n);
    	TraveList(L);
    	printf("链表长度:%d\n", ListLength(L));
    	
    	printf("请输入要交换的结点的值:");
    	DLnode *s;
    	s = new DLnode;
    	scanf("%d", &s->data);
    	DLnode *p;
    	p = L->next;
    	while (p != L) 
    	{
    		if (p->data == s->data) 
    		{
    			Change(p);
    
    			break;
    		}
    		else 
    		{
    			p = p->next;
    		}
    	}
    	
    	TraveList(L);
    
    	system("pause");
    
    	return 0;
    }
    • 运行结果

    展开全文
    qq_22847457 2019-07-03 09:18:41
  • 路由与交换 学习笔记 路由与交换xmind导图 名词定义以及相关命令 章节 名词 定义/作用 优缺 相关 命令 记数字 1 CSMA/CD 避免冲突产生的机制 冲突       共享型...

     

    路由与交换

    学习笔记

    路由与交换xmind导图

    名词定义以及相关命令

    章节名词定义/作用
    优缺
    相关命令记数字
    1CSMA/CD避免冲突产生的机制冲突  
     共享型以太网以太网中,任意一台设备都可以看到发送的所有信息   
     集线器Hub对接收到的信号放大以扩大网络的传输距离;不加区分转发数据,增大冲突几率   
     网桥早期的两端口二层网络设备,用来连接不同网段,每个端口隔离为一个冲突域   
     接口交换容量所有端口都在工作,双向数据传输速率之和  K/M/G(千兆)/T太;相邻单位相差1000
     双工模式指数据双向转发接口交换容量 以太网数据帧最小长度72B+数据帧间隙12B共84B即672bit
     接口包转发率指所有端口都在工作,每秒可转发的数据包数量之和   
     广播帧ARP进行mac请求时发送的request包,其目的地址全为FARP  
     交换机能从逻辑上按照管理员的配置将自己的接口划分到多个不同的冲突域冲突域  
     路由器隔离广播域,通过查询IP路由表为往返于不同网络间的数据提供转发服务广播域  
     泛洪(flood)交换机接收到未知的单播帧或广播帧、组播帧,则向从除了接收到它的那个接口之外的所有端口转发   
     组播地址 MAC地址的第一字节的最后一位是1  
     MAC地址表建立(分为动态学习和手工静态两种)收到一个数据帧时,会将这个数据帧的源MAC地址和接收到这个数据帧的接口编号作为条目保存在自己的MAC地址表中,同时在接收到这个数据帧时重置老化计时器的时间交换机工作原理查看MAC地址表
    display mac-address
     
     MAC地址表维护在老化时间之内没有通过这个接口再次接收到这个MAC地址发来的数据帧,就会删除,MAC地址表老化时间默认为300s交换机工作原理查看MAC地址表老化时间
    display mac-address aging-time
    修改老化时间
    mac-address aging-time xx
     
     MAC地址表的静态创建优先级高于交换机自己接口动态学习的,不受老化影响一直保存 添加静态MAC地址条目
    mac-address static XXXX-XXXX-XXXX g1/1 vlan 1
     
     核心层不对数据帧、包进行任何的处理,给各个汇聚层设备之间提供流量快速转发企业园区网分层设计  
     汇聚层流量汇聚,并通过流量控制策略对流量转发进行优化   
     接入层部署大量的低端二层交换机,为终端设备提供接入和转发   
     全双工模式可以同时收发(电话);没有冲突域,所以不会启用csma/cd双工关闭自动协商,进行强制配置
    undo negotiation auto
    duplex {full | half}
    speed speedvalue
     
     半双工模式接收和发送不能同时进行(对讲机);构成了一个冲突域,所以启用csma/cd共享型以太网  
     MAC地址泛洪攻击利用交换机的MAC学习机制,通过发送伪造源地址的数据包,让交换机学习到错误的MAC地址转发表项,而且MAC地址表项是有数目限制的,通过这种伪造的虚假数据包将交换机的mac地址表占满,导致正常的数据包转发时匹配不到转发表项而泛洪到VLAN内的所有其它端口,这样,攻击者就可以实现报文侦听了泛洪  
          
    2VLAN给数据帧插入不同的VLAN标签,交换机通过VLAN标签分辨出各个数据帧所属的VLAN(交换机是bus,数据帧是游客,vlan标签是数字贴纸)交换机隔离广播域技术,一个VLAN就是一个广播域)广播域创建VLAN
    vlan vlan-id
    vlan batch {vlan-id1 vlan-id2}
    vlan batch {vlan-id1 [to vlan-id2]}
    查看display vlan
    删除undo vlan vlan-id
     
     VLAN 标签用来区分数据帧所属VLAN贴纸,4字节,它以插入以太网数据帧头部的方式被贴在数据帧上。
    包含TVID和TCI(优先级PRI、CFI、VLANID)
    数据帧查看特定VLAN的详细信息,其中包括VLAN类型、描述、VLAN状态、所包含的接口,以及这些接口的状态等
    display vlan [vlan-id [verbose]]
    查看指定VLAN的流量统计信息display vlan vlan-id statistics
    查看交换机中所有VLAN的汇总信息
    display vlan summary
    包含VLAN IDVLAN标识符)长12比特,其中配置的VLAN ID取值范围是14094
     PVID通过每个接口的PVID,判断从这个接口收到的无标记帧属于哪个VLAN,进一步转发时,在数据帧中插入相应的VLAN标签,将无标记帧变为标记帧(Tagged),默认值为1交换机接口、跨交换机VLAN默认值为1 
     Access接口用于连接终端设备;收到数据帧时会判断这个数据帧是否携带VLAN标签,若携带则判断数据帧的VLAN ID是否与本接口的PVID相同,若相同则转发,若不同则丢弃,若不携带则为数据帧打上VLAN标签;发送数据帧时移除VLAN标签。只能传输一个VLAN的数据交换机接口、跨交换机VLAN配置Access接口
    port link-type access
    port default vlan 5
     
    ?
    ppt2.37
    Trunk接口用于交换机之间互联;允许传输多个VLAN的数据。收到数据帧时会判断这个数据帧是否携带VLAN标签,若携带判断本接口是否允许传输这个数据帧的VLAN ID,若允许则转发,若不同则丢弃,若不携带则为数据帧打上VLAN标签;发送数据帧时移除与出站接口的PVID相同的VLAN标签,若不同则转发。交换机接口、跨交换机VLAN配置Trunk接口
    port link-type trunk
    port trunk allow-pass vlan 5
     
     GARP协议(通用属性注册协议)把一个GARP成员(交换机等设备)上配置的属性信息,快速且准确地传播到整个交换网络中   
     GVRP交换机实现VLAN管理;单向注册/撤销,只有接收到了Join/Leave消息的交换机接口才会注册/撤销该VLAN交换机接口、Access接口、Trunk接口  
     Normal(普通)GVRP默认注册模式,当Trunk接口为Normal时,表示GVRP能够在该接口静态或动态创建、注册和注销VLAN,同时该接口能够发送有关静态VLAN和动态VLAN的声明消息。GVRP的注册模式
    Trunk接口
      
     Fixed(固定)Trunk接口为Fixed时,GVRP不能在该接口注册或注销动态VLAN,只能发送静态VLAN的注册信息。也就是说,即使管理员通过配置允许所有VLAN的数据通过接口,该接口实际上也只会放行管理员手动配置的那些VLAN中的数据。GVRP的注册模式
    Trunk接口
      
     Forbidden(禁止)Trunk接口为Forbidden时,GVRP不能在该接口上动态注册或注销VLAN,并且会删除接口上除VLAN 1之外的所有VLAN信息,只保留VLAN 1的信息。也就是说,即使管理员配置该接口允许所有VLAN的数据通过,该接口实际上也只放行VLAN 1的数据。GVRP的注册模式
    Trunk接口
      
     Hybrid接口能够接收和发送多个VLAN的数据交换机接口、跨交换机VLANHybrid配置命令
    port link-type hybrid
    port hybrid tagged vlan {{vlan-id1 [to vlan-id2]} | all}
    port hybrid untagged vlan {{vlan-id1 [to vlan-id2]} | all}
     
          
    3冗余解决单点故障;但可能给网络带来重复帧、MAC地址震荡、广播风暴等由一个广播帧引发的常见隐患   
     MAC地址震荡(翻动)从不同端口收到源MAC地址相同的数据帧,导致MAC地址表条目发生变动冗余  
     广播风暴交换机这种无限制的泛洪行为而充斥着越来越多的广播帧,这些广播帧的泛洪没有停止的理由冗余  
     STP算法从逻辑上切断环路,并且确保在切断环路的同时,所有节点的可达性依旧可以得到保障;根据规判断出哪些端口能否转发数据,不能转发数据的端口将它禁用起来,实时监控各个端口和链路的状态,当出现故障时启用一些被禁用的端口;冗余启用STP:
    stp enable
    STP模式修改(华为交换机默认的STP模式是MSTP):
    stp mode stp
    STP优先级(范围是0~61440)必须是4096的倍数:
    stp priority 4096
     
     根网桥根交换机或根(网)桥;选举原则:交换机之间相互对比桥ID的优先级、MAC地址数字STP角色查看STP端口角色
    display stp brief
    查看端口STP相关信息
    display stp interface GigabitEthernet 0/0/1
     
     根端口(RP)负责转发数据;每台非根交换机都要选;非根交换机选择出距离根网桥最近的端口;选举原则:根路径开销(Root Path Cost,RPC)、对端(收到的)桥ID(BID)、对端端口ID(PID);处于转发状态;STP角色  
     指定端口(DP)负责转发数据;每个网段都要选,根交换机的每个端口都是指定端口;同一网段中所有端口间距离根网桥最近的端口;选举原则:根路径开销(Root Path Cost,RPC)、桥ID、端口ID;处于转发状态;STP角色  
     预备端口(AP)处于阻塞状态,不能转发数据;是落选的端口;那些既不是根端口,也不是指定端口的其他所有端口置于阻塞状态,选举被剩下的端口就是预备端口;不会接收或发送任何数据,但会处于监听的状态;STP角色  
     BPDU 桥协议数据单元携带着桥ID、根桥ID、根路径开销等信息,STP通过比较BPDU中携带的信息进行选举;不是数据STP选举  
     配置BPDU (Configuration BPDU)STP树形成初期,各STP交换机都会周期性地(缺省为2秒)主动产生并发送配置BPDU。在STP树形成的稳定期,只有根桥才会周期性地(缺省为2秒)主动产生并发送配置BPDU,非根交换机会从自己的根端口周期性地接收到配置BPDU,并立即被触发而产生自己的配置BPDU,且从自己的指定端口发送出去,看起来就像是根发出的配置BPDU逐跳地经过了其他的交换机。STP选举、BPDU  
     拓扑变化通知 BPDU (TCN BPDU)是非根交换机通过根端口向根网桥方向发送的,当非根交换机检测到拓扑变化后会生成一个描述拓扑变化的TCN BPDU,并将其从自己的根端口发送出去STP选举、BPDU  
     ID(BID)由优先级16 bit字段(默认为32768)和交换机硬件MAC地址48 bit字段组成一个64 bit的字段根网桥选举、根端口(RP)选举、指定端口(DP)选举 优先级16 bit字段默认为32768
    交换机的硬件MAC地址48 bit字段;
    优先级和MAC地址组成一个64 bit的字段
     端口ID(PID)由优先级(0240,必须是16的倍数)和端口号构成;根端口(RP)选举、指定端口(DP)选举  
     未启用(Disabled)严格上不算是STP端口状态,端口还未启用STP端口状态机使端口处于“管理关闭”状态
    shutdown
     
     阻塞状态(Blocking是稳定状态,端口接收并处理BPDU,不发送BPDU,不学习MAC地址表,不转发数据;一旦端口被选为根端口或指定端口,它就会立即进入侦听状态;STP端口状态机、预备端口  
     侦听状态(Listening)是过渡状态,端口接收并发送BPDU,参与STP计算,不学习MAC地址表,不转发数据;端口一旦进入到侦听状态(或学习状态),必须等待15秒才能过渡到学习状态(或转发状态);STP端口状态机 转发延迟计时器默认为15秒;阻塞状态进入转发状态经历30秒
     学习状态(Learning是过渡状态,端口接收并发送BPDU,参与STP计算,学习MAC地址表,不转发数据;端口一旦进入到侦听状态(或学习状态),必须等待15秒才能过渡到学习状态(或转发状态);STP端口状态机  
     转发状态(Forwarding)是稳定状态,是根端口和指定端口的最终状态,端口接收并发送BPDU,参与STP计算,学习MAC地址表,转发数据;STP端口状态机、根端口、指定端口  
     转发延迟超时事件避免STP阻塞状态的端口过渡到转发状态而产生临时环路STP端口状态机、侦听状态、学习状态配置转发延迟取值范围是400~3000,默认为1500(15s)
    stp timer forward-delay 2000
     
     max-age(默认的保存BPDU时间)STP环境中发生故障预备端口无法从对端的指定端口收到BPDU,交换机就会重新开始计算STP,取值范围是600~4000,默认为2000,也就是20秒:STP计时器参数stp timer max-age 3000 
     Hello时间取值范围是100~1000,默认为200,也就是2秒,根网桥会根据这个时间设置来生成并发送CBPDU(配置BPDU)STP计时器参数stp timer hello 300 
     STP计时器(转发延迟−1秒)≥ MaxAge  ≥ 2×Hello时间+1秒)STP计时器参数  
     STP网络直径STP根据管理员定义的网络环境自动计算出适用于这个网络的计时器值STP计时器参数stp bridge-diameter 2 
     RSTP定义了新的端口角色可以让端口直接由阻塞状态过渡到转发状态,减少了交换机等待根交换机发送CBPDU的时间;预备端口在根端口及其链路出现故障时接任根端口的角色,备份端口在连接到那个物理网段的指定端口出现故障时接任指定端口的角色 修改STP模式:
    stp mode rstp
    指定根桥命令(优先级固定为0)配置后管理员就无法通过stp priority value修改交换机的优先级值:
    stp root primary
    指定次根桥命令(优先级固定为4096):
    stp root secondary
     
    ?备份端口(BP)接收的更优BPDU是由其他网桥转发来的为预备端口,接收的更优BPDU是由本网桥发来的为备份端口;RSTP端口角色  
     边缘端口需要管理员手动配置来为交换机指定边缘端口,RSTP认为这些端口不会在下游产生环路,计算拓扑时就不会考虑这些端口;点到点端口中的一种特殊类型 所有端口默认设置为边缘端口:
    stp edged-port default
    SWC的E0/0/5端口设置为边缘端口:
    [SWC]interface e0/0/5
    [SWC-Ethernet0/0/5]stp edged-port enable


     
     
    ?P/A同步过程在确定自己接收到Proposal的端口是根端口之后,SW为了避免出现环路而阻塞自己所有非边缘的指定端口使这些端口都进入Blocking阻塞状态P/A机制、RSTP快速收敛  
     RSTPDiscarding(丢弃状态) 因为都不发送BPDU、不学习MAC地址表、也不转发数据,将Disabled(禁用状态)、Blocking(阻塞状态)和Listening(侦听状态)合并为了Discarding(丢弃状态)RSTP端口角色  
     BPDU保护功能让边缘端口在接收到BPDU消息时被交换机直接禁用,不会参与STP计算,该端口也会维持在DOWN状态边缘端口配置BPDU保护功能:
    stp bpdu-protection
    恢复因BPDU保护功能导致端口down方法:
    shutdown->undo shutdown手动进行恢复
    restart命令重启端口
    error-down auto-recovery cause bpdu-protection interval interval-value

     
     
     MSTP多生成树协议使交换机根据管理员设计的VLAN组合来计算网络生成树的STP模式VLAN进入了MST域视图
    stp region-configuration 
    指定这个MST域使用的名称(同一个MST域中的交换机上都要配置相同的域名):
    region-name mst-region
    创建了实例与VLAN的映射关系:
    instance 20 vlan 20
    为减少网络拓扑的震荡,管理员配置的MST域新参数是不会立即生效需要激活:
    active region-configuration
    每个实例指定根网桥:
    stp instance 10 root secondary
    stp instance 20 root primary
    SWA上查看MSTP区域:
    [SWA]stp region-configuration 
    [SWA-mst-region]check region-configuration
     
          
    4路由(routing)中间设备(比如路由器)通过查找路由表对数据包进行转发的处理方式,路由器相互学习路由和根据最长匹配原则来判断数据包出站接口   
     MAC地址可以用来定位设备、工作于数据链路层、物理地址、随载体移动、只适合在局域网范围内二层地址寻址   
     IP地址以用来定位设备、工作于网络层、逻辑地址、不随载体移动、更大的范围内设备则只能使用层次化的三层逻辑属性地址也就是IP地址来进行寻址   
     路由表等价于转发数据库、存储着路由条目、路由度量值、出接口等等; 查看IPv4路由表的摘要信息:
    display ip routing-table
    查看路由表的详细信息:
    display ip routing-table verbose

     
     
     路由条目转发数据的路径   
     直连路由只要连接该网络的接口状态正常,无需多做配,就会出现在路由表中,由链路层协议路由查看到接口的状态:
    display ip interface brief
    查看IP路由表
    display ip routing-table
    在AR1的GigabitEthernet0/0/1接口上配置IP地址,激活该接口:
    [AR1]interface GigabitEthernet0/0/1
    [AR1-GigabitEthernet0/0/1]ip address 10.1.12.1 24
     
     静态路由需要管理员通过命令手动添加到路由表中;告诉路由器应该向哪里转发去往某个未知网络的数据包;无需像动态路由那样占用路由器的CPU资源来计算和分析路由更新路由查看指定静态路由协议的路由信息:
    display ip routing-table protocol static 
    静态路由的配置(目标网络&本地出接口;目标网络&下一跳地址;目标网络&本地出接口&下一跳地址):
    [AR1]ip route-static 192.168.2.0 255.255.255.0 10.0.12.2 
    [AR1]ip route-static 192.168.2.0 24 10.0.12.2 
    [AR1]ip route-static 192.168.2.0 24 S1/0/0 
     
     动态路由通过路由协议从邻居路由器那里学习过来的路由;首先告诉路由器应该开始运行哪项动态路由协议,然后告诉路由器可以将自己哪些已知网络的路由信息通过这种路由协议通告给其他运行这项动态路由协议的路由设备路由  
     路由优先级范围是0~255,优先级值越小,代表这种类型的路由可信度越高;路由、直连路由、OSPF、静态路由、RIP 优先级直连路由DO、OSPF路由O10、静态路由S60、RIP路由R100
     路由度量值去往目的网络的开销,每项路由协议都定义了自己计算度量值时使用的参数和算式;RIP采用跳数;OSPF采用带宽路由、OSPF、RIP  
     最长匹配的原则路由器在转发时会根据路由表中匹配掩码最长,也就是最精确的路由条目来转发数据包   
     默认路由特殊的静态路由、是目的地址全0的最不精确的特殊路由,可以由路由协议自动生成,也可以由手动配置;管理员用一条默认路由指向运营商网络,以这种方式让网关路由器将所有从企业网去往互联网的流量都路由给运营商路由器静态路由配置静态默认路由(目的IP地址为全零,掩码也为全零,这样的组合表示匹配所有IP地址,ip route-static 0.0.0.0 0.0.0.0 下一跳地址):
    [Huawei]ip route-static 0.0.0.0 0.0.0.0 200.8.10.2
     
     路由汇总一组路由压缩成单一路由 配置静态汇总路由
    [AR1]ip route-static 10.8.80.0 22 192.168.12.2
     
     负载分担一台路由器上有两条以不同路径去往同一个网络的等优先级静态路由时,路由器就会同时利用这两条链路来转发流量静态路由优先级  
     浮动静态路由(备份路由)去往同一目的网络,配置优先级不同;优先级最高的路由出现故障时,使用另一条路由优先级值比较大(也就是次选)的路由来转发流量,主链路恢复正常后,静态路由优先级高的重新被激活,而静态路由优先级低的作为备份路由,在路由表中删除,放到Inactive列表中;静态路由AR1上配置静态浮动路由:
    [AR1]ip route-static 10.0.84.0 24 serial 0/0/0 192.168.12.2
    [AR1]ip route-static 10.0.84.0 24 serial 0/0/1 192.168.21.2 preference 70
    筛选出只有静态路由的路由表项:
    display ip routing-table protocol static 
     
     掩码掩码位数设置得比实际大,会使路由覆盖不全子网的实际大小;比实际小会覆盖比子网实际大小更多的主机,形成路由黑洞静态路由排错  
          
    5VLAN间路由通过拥有三层功能的设备所提供的路由机制来为不同VLAN中的设备路由数据包   
     传统VLAN间路由直接通过交换机的MAC地址表进行转发;MAC地址表记录了交换机端口与对端MAC地址之间的对应关系、这个端口所在的VLAN,这也暗示交换机不会通过查询MAC地址表,就把从一个VLAN中的端口接收到的数据帧从属于另一个VLAN中的端口转发出去 [SW1-GigabitEthernet0/0/1]port link-type access 
     单臂路由节省路由器接口,又满足给所有VLAN提供路由的需求;通过逻辑的方式将一个路由器物理接口划分(虚拟化)为多个逻辑子接口逻辑子接口创建了子接口并进入子接口配置视图:
    [AR1]interface g0/0/0.10
    指定端口的PVID
    [AR1-GigabitEthernet0/0/0.10]dot1q termination vid 10
    启用子接口ARP广播功能(默认ARP广播功能是禁用):
    arp broadcast enable
     
     逻辑子接口通过逻辑的方式将一个路由器物理接口划分(虚拟化)为多个逻辑子接口单臂路由  
     三层交换技术一台交换机可以集成三层路由的功能,能在同一个VLAN中的主机提供基于MAC地址的数据帧转发,还可以在内部消化掉整个VLAN间路由所需的三层数据包转发;交换机创建了一个VLANIF接口,VLAN中的主机会以相应的VLANIF接口IP地址作为自己的默认网关:
    [SW1]interface Vlanif 10
     
     虚拟VLAN接口(SVI)所在的网段作为直连路由填充在路由表中;   
          
    6距离矢量型路由协议(Distance Vector)RIP;距离描述这条路由的目的网络距离本地路由器有多远;矢量描述这条路由的目的网络在本地路由器的什么方向,也就是路由器在根据这条路由转发数据包时,应该把数据包转发给哪台下一跳设备或者自己的哪个出站接口;采用贝尔曼-福特(Bellman-Ford)算法,种算法可以根据其他路由器分享的距离和矢量信息,计算出去往各个网络的路由;运行距离矢量型路由协议的路由设备向相邻的路由器分享路由信息时,在学习到运行相同DV路由协议所通告的路由信息之后,路由器会运行路由算法来计算去往这些网络的路由,并把开销值最低的路由填充到路由表中;路由器只拥有自己周围这几台路由器分享的距离和矢量信息,就是徒步路线上的分道指示牌;周期更新,每隔一段固定的时间,就将自己当前完整的路由表通告给相邻的(运行相同路由协议的)路由器路由协议、算法角度  
     链路状态型路由协议(Link State)OSPF;在运行LS型路由协议的路由器完成了全部的链路状态信息交互之后,每一台路由器上都会拥有对于整个网络完全相同的信息,使用Dijkstra算法,通过这些信息计算出去往各个网络的最优路径;路由器则像是在每个路口为远足者提供一张完整的区域地图;链路状态信息中包含了各个直连链路的网络/掩码、网络类型、开销值及邻居设备、序列号和过期信息;路由协议、算法角度  
    有类路由协议不支持VLSMCIDR,据IPv4地址前3位二进制数判断这个网络地址的主类(A类、B类或C类),发送路由更新消息时也不会携带掩码信息路由协议、掩码角度  
    无类路由协议在更新消息中携带子网掩码,接收方也可以根据更新消息中的子网掩码来将对方通告的子网纳入路由表中。路由协议、掩码角度  
     路由环路路由器无法根据相邻设备通告的路由信息,判断出自己是不是被包含在了去往该网络的路径中距离矢量算法  
     RIP协议基于UDP的应用层协议;度量值等于跳数; 启用RIP进程1:
    rip
    把版本修改为RIPv2(华为路由器默认使用的RIP版本为RIPv1):
    version 2
    使IP地址属于通告子网的接口启用RIP进程(RIPv2支持VLSM,但在配置路由通告时仍会使用主类网络):
    network X.X.0.0
    查看有关RIP的更多信息,其中包括这台路由器上使用的RIP进程号(默认1)、版本号(默认1,管理员通过RIP视图的命令version 2将其修改为2)、优先级(默认100),以及通告的网络:
    display rip
    路由器在RIPv2中通告一条默认路由:
    default-route originate
    查看邻居:
    [AR1]display rip 1 neighbor
    查看了AR1通过RIP学习到的路由:
    [AR1]display rip 1 route
    改RIP路由优先级值(只具有路由器本地意义,不会随路由信息进行传递,也不会影响其他RIP邻居的路由选择):
    [AR1]rip
    [AR1-rip-1]preference 50
    使路由器本地的所有接口不向外发送广播或组播RIP消息但并不禁止路由器发送单播RIP消息(抑制接口):
    [AR2-rip-1]silent-interface all
    启用了本地属于10.8.0.0/24子网的接口发送RIP单播更新的功能:
    [AR2-rip-1]peer 10.8.0.1
    禁止接口以任何形式(广播、组播、单播)向外发送RIP更新:
    undo rip output
    修改S0/0/0接口发出RIP路由的度量值:
    [AR1]interface s0/0/0
    [AR1-Serial0/0/0]rip metircout 3
    删除修改RIP度量值:
    [AR1]interface s0/0/0
    [AR1-Serial0/0/0]undo rip metricout
    在AR2 S0/0/0接口上修改入向路由更新的度量值:
    [AR2]interface s0/0/0
    [AR2-Serial0/0/0]rip metricin 2

     
    端口号520
    RIP规定最大度量值为16跳;
     RIPv1典型的有类路由协议,采用广播进行周期更新,无法认证身份;  RIPv1封装的RIP消息的目的地址是255.255.255.255;
     RIPv2无类路由协议,RIPv2有效利用RIPv1报文结构的一些未使用字段,为了在发送更新时携带网络的子网掩码,RIPv2利用了RIPv1报文结构中的一个未使用字段作为了子网掩码字段;建立邻居双方必须使用相同认证方式和密码,不直接建立邻居的路由器接口可以使用不同的认证方式和密码 配置RIPv2明文认证:
    [AR1-Serial0/0/1]rip authentication-mode simple huawei12
    配置RIPv2加密认证关键字md5+数据包加密格式nonstandard(IETF格式)+关键字cipher+密码+MD5认证使用的密钥ID1:
    [AR2-Serial0/0/2]rip authentication-mode md5 nonstandard cipher
    RIPv2发送RIP消息时封装的目的IP地址为组播地址224.0.0.9;
     更新计时器(Update Timer)每周期向外通告一次路由更新信息;RIP协议计时器修改RIP计时器更新老化垃圾收集计时器、(取值范围都是1~86400):
    [AR1-rip-1]timers rip 10 60 40
    默认为30秒
     老化计时器(Age Timer)一段时间没有通过启用了RIP的接口接收到某条路由的更新消息,而这条路由的更新消息就应该通过这个接口接收到时,路由器就会将这条路由标注为不可达,但不会将这条路由从RIP数据库中删除RIP协议计时器 默认为180
     垃圾收集计时器(Garbage Collect Timer)从一条路由被标记为不可达,到路由器将其彻底删除之间的时间RIP协议计时器 默认是120
     地址簇标识符标识路由的地址类型,如果地址为IP地址,则这个字段的值取2;RIP协议的封装字段  
     外部路由标记告诉接收方路由器,这条路由是通过哪种路由协议学习到的RIP协议的封装字段  
     RIP请求报文让该接口所在链路的其他RIPv2路由器将自己的路由信息通过RIP响应报文通告给自己RIP报文  
     RIP响应报文向该接口所在链路的其他RIPv2路由器通告自己的网络RIP报文  
     水平分割(Split Horizon)禁止路由器将从一个接口学习到的路由,再从同一个接口通告出去;被动的防环机制RIP协议、环路避免机制查看AR1上的RIPv2水平分割状态毒性反转特性,水平分割默认启用,毒性反转特性默认禁用:
    [AR1]display rip 1 interface s0/0/0 verbose
     
     毒性反转(Poison Reverse)属于水平分割的一种变体,当路由器从一个接口学习到一条去往某个网络路由时,它就会通过这个接口通告一条该网络不可达的路由;主动的防环机制RIP协议、环路避免机制启用毒性反转特性:
    [AR1]interface s/0/0
    [AR1-Serial0/0/0]rip poison-reverse
     
     路由毒化(Route Poisoning路由器会将自己路由表中已经失效的路由作为一条不可达路由主动通告出去RIP协议、环路避免机制  
     触发更新(Triggered Update指路由器在网络发生变化时,不等待更新计时器到时,就主动发送更新;结合路由毒化和触发更新可以迅速将网络出现变化的消息通告网络中的其他路由器,避免网络在等待计时器过期的过程中出现环路,加速网络的收敛RIP协议、环路避免机制  
     RIP的自动汇总功能将同一主类子网明细路由汇总成一条主类网络的汇总路由,减小路由条目,降低传输RIP协议消息的数量。RIPv2的自动汇总进行了优化:只有当接口上禁用了水平分割特性后,RIPv2才会执行自动汇总。RIP协议只查看通过RIP学到的路由:
    display ip routing-table protocol rip
    在接口上禁用RIP水平分割特性:
    [AR1]interface s0/0/0
    [AR1-Serial0/0/0]undo rip split-horizon
    配置RIPv2手动汇总,子网掩码必须配置为点分十进制格式:
    [AR1]interface s0/0/0
    [AR1-Serial0/0/0]rip summary-address 10.0.0.0 255.255.128.0
     
     环回接口环回接口不会受到网络变化和设备故障的影响远比物理接口更加稳定,因此环回接口上配置的IP地址会优先被一些路由协议用作标识符或建立邻居关系;RIP协议以环回接口的/32位路由来验证RIP路由的传输,在路由器的环回接口0上配置了掩码为/32位的IP地址:
    [AR3]interface loopback 0
    [AR3-LoopBack0]ip address 3.3.3.3 32
     
     最短路径树每台路由器自己独立根据拓扑图来运行算法,计算出从自己去往网络中各个节点的最短路径距离矢量型路由协议  
          
    7OSPF(开放式最短路由优先)协议链路状态型路由协议,周期性发送hello消息用于建立和维护OSPF邻居关系,只有建立了完全(Full)邻接关系的OSPF设备之间才会相互交换链路状态信息链路状态型路由协议OSPF的进程创建与路由器ID指定:
    [AR1]ospf 100 router-id 1.1.1.1
    进入OSPF区域配置视图:
    [AR1-ospf-100]area 0
    让接口运行OSPF协议,接口的IP地址必须在network命令指定的IP网络范围之内:
    [AR1-ospf-100]network 10.8.0.1 0.0.0.0
    OSPF路由查看:
    display ip routing-table protocol ospf
    OSPF的邻居简略信息查看:
    display ospf peer brief
    OSPF的邻居详细信息查看:
    display ospf peer 
    查看OSPF邻居区域100的详细信息:
    display ospf 100 peer
    查看与OSPF相关的接口参数:
    [AR4]display ospf 100 interface g0/0/0
     
     邻居表通过Hello消息找能够交换链路状态信息的邻居,记录路由器各个接口所连接的OSPF邻居设备,与该邻居设备之间的邻居状态等信息;OSPFHello  
     LSDB链路状态数据库路由器会通过相互交换链路状态通告消息实现LSDB的同步,域内所有路由器有相同的LSDB,LSDB中包含其他路由器通告的链路状态信息,可以抽象成一张包含路径权重的有向图OSPF  
     路由表通过SPF算法获得去往各个网络的最优路由并放于路由器的路由表中。OSPFSPF  
     OSPF头部包含:版本
    消息长度、路由器ID(这台路由器在OSPF网络中的身份)、区域ID(实现路由网络的层级化)、校验和(路由器会通过OSPF头部的校验和字段校验整个OSPF数据包)、认证类型(标识这个OSPF数据包需要进行哪种类型的认证)、认证(对方路由器认证的具体数据)、类型(OSPF报文的类型)
    OSPF封装消息  
     认证取值为0不需要认证、1简单的密码认证、2MD5认证OSPF头部  
     类型1Hello消息、2数据库描述消息、3链路状态请求消息、4链路状态更新消息、5链路状态确认消息OSPF头部 1Hello消息;2:数据库描述消息;3:链路状态请求消息;4:链路状态更新消息;5:链路状态确认消息。
     Hello消息建立维护OSPF邻居关系;数据部分有接口掩码、Hello时间间隔、路由器失效时间间隔、邻居的路由器ID;建立邻居的必要条件:接口掩码相匹配、Hello时间间隔、路由器失效时间间隔、认证类型和认证秘钥相同;邻居表、OSPF报文  
     数据库描述消息BD把自己LSDB中所有链路状态通告(LSA)列出一个清单,然后交换这个清单,使用对方发送的清单进行查漏补缺;数据部分有数据库描述消息序列号(判断这个数字是否连续确定自己是否接收到了所有双方交换的数据库描述消息)、LSA头部(描述路由器链路状态数据库中LSA的清单)OSPF报文、LSDB、LSA头部  
     链路状态请求消息LSR路由器通过其他OSPF路由器发来的2数据库描述消息进行了查漏后发送3链路状态请求消息请该设备用其链路状态数据中的LSA来为自己补缺;数据部分有链路状态类型、链路状态ID和通告路由器IDLSA头部  
     链路状态更新消息LSU路由器收到邻居发来的3链路状态请求消息后按照该消息中指定的LSA封装一个链路状态更新消息,将对方所请求的LSA副本通过4链路状态更新消息通告给它;数据部分包含:LSA数量、LSA链路状态通告LSA  
     链路状态确认消息LSAck使用各个LSA的头部来确认更新消息中包含的LSA;数据部分包含LSA头部LSA头部  
     网络类型路由器接口所使用的数据链路层封装,决定了该接口启用OSPF之后该接口默认的OSPF网络类型OSPF、接口类型  
     广播(Broadcast以太网接口在启用OSPF之后,默认的OSPF网络类型即为广播,OSPF报文目的地址为224.0.0.5、224.0.0.6,要选举DR\BDROSPF网络类型、以太网、DR、多路访问型网络  
     点到点P2P路由器串行接口(Serial)(默认封装PPP)在启用OSPF之后,默认的OSPF网络类型即为点到点,OSPF报文目的地址为224.0.0.5OSPF网络类型、串行接口  
     非广播多路访问NBMA路由器串行接口的封装修改为了帧中继(FR),那么该接口默认的网络类型也会随之变为非广播多路访问,OSPF报文目的地址为邻居单播IP地址,要选举DR\BDROSPF网络类型、串行接口、DR、邻居、多路访问型网络  
     点到多点(P2MP) 无OSPF报文目的地址224.0.0.5OSPF网络类型  
    比大路由器ID点分十进制32位,唯一地标识路由器身份,无抢占性,只有对OSPF进程重启,路由器才会在再次启动OSPF进程时,根据启动时的情况重新选择路由器ID,即使管理员手动配置了路由器ID,也必须重启OSPF生效;选举:手动静态配置路由器ID、最大的环回接口地址、最大的活动的物理接口IP地址OSPFDR选举  
     DR指定路由器(Designated Router)从所有路由器那里收集链路状态信息,并将信息发布给所有路由器,DR/BDR与其他路由器之间建立完全邻接关系;选举:身份不抢占、在位不选举、先比优先级、再比路由器ID。OSPF、路由器优先级、路由器ID  
     BDR备份指定路由器(Backup Designated Router也会与所有的邻居建立可以相互共享链路状态信息的完全邻接关系,DR出现故障时,BDR会取而代之;OSPF  
     DRother既非DR亦非BDROSPF路由器OSPF  
    比大DR优先级手动修改影响DR/BDR选举、8位二进制数取值范围为0~255,数值越高即优先级越高,默认华为路由器接口的OSPF优先级值为1,0取消参与选举的资格OSPFDR选举[AR1]interface g0/0/0
    [AR1-GigabitEthernet0/0/0]ospf dr-priority 100
     
     OSPF的邻居状态机DownInit2-wayExstartExchangeLoadingFull   
     Exstart路由器之间通过发送空的DBD报文来协商主/从关系,路由器ID大的设备会成为主路由器,DBD序列号由主路由器决定DR、邻居状态机、路由器ID、过渡状态  
     Exchange向邻居发送描述自己LSDB的中包含LSA的头部的DBD报文,会逐个发送DBD报文,每个报文都中包含着有主路由器决定的DBD序列号,并且这个序列号会在DBD报文的交互过程中递增,以确保DBD报文交互过程的有序性和可靠性DBD、邻居状态机、过渡状态  
     Loading把邻居那里收到的LSA头部与自己的LSDB进行比较,如果自己缺少了某些LSA,路由器就会向邻居发送LSR请求它所缺少的LSA的完整数据,邻居则会使用LSU进行回应,只有LSU报文里才包含有LSA的完整信息,收到LSU报文后,路由器需要发送LSAck对其中的LSA进行确认LSA、邻居状态机、过渡状态  
     Full路由器的链路状态数据库已经实现了同步邻居状态机  
     DBD周期性通告与触发更新相结合,OSPF通告  
     Dijkstra算法路由器将自己作为树根;将自己直连的邻居节点添加到树状拓扑中,将非直连节点添加到候选列表中;将每个候选列表中的节点与拓扑中的节点进行比较,若候选节点与任何一个邻居节点的开销值最小,则将候选节点添加到树状拓扑中,并将其从候选列表中删除;重复上述算法,直至候选列表中所有节点都被添加到树状拓扑中。路由计算  
          
    8认证提升网络的安全性,防止未授权用户把自己的设备插入到网络中,影响其他设备的路由学习操作,分类:区域和接口OSPF  
     明文认证simple指定明文认证,任何人通过抓包可以在解析信息中看懂密钥信息;通过关键字plain和cipher指定在路由器配置文件中如何保存密钥信息,前者明文保存,后者密文保存认证OSPF接口配置明文认证:
    [AR4-Serial0/0/0]ospf authentication-mode simple plain huawei
    OSPF区域配置明文认证:
    authentication-mode simple { plain plain-text | cipher cipher-text | null }
     
     加密认证关键字md5或hmac-md5指定加密方式、任何人在网络中抓包后无法解析看懂密钥信息只能看到加密后的“乱码”认证OSPF接口配置加密认证:
    ospf authentication-mode { md5 | hmac-md5 } key-id { plain plain-text | cipher cipher-text }
    OSPF区域配置加密认证:
    [AR1-ospf-100-area-0.0.0.0]authentication-mode md5 1 cipher huawei
     
     FR帧中继网络中的OSPF在帧中继和ATM网络环境中配置OSPF时,需要手动指定邻居来实现单播更新,通过单播更新,OSPF邻居之间仍需要选择DRBDRNBMA口的链路协议更改为帧中继:
    link-protocol fr
    指定邻居:
    [AR1-ospf-200]peer 10.0.0.2
    将接口的网络类型改为了点到多点:
    [AR1]interface s0/0/0
    [AR1-Serial0/0/0]ospf network-type p2mp
     
     OSPF计时器Hello计时器的4倍作为Dead计时器,路由器会按照管理员指定的4倍Hello时间,自动更新Dead计时器的设置,反之若管理员先配置Dead计时器Hello计时器不受影响;OSPF、计时器修改ospf hello时间间隔:
    ospf timer hello {times}
    修改ospf邻居死亡间隔时间:
    ospf timer dead {times}
    查看AR1 G0/0/0接口当前的OSPF计时器:
    [AR1]display ospf interface g0/0/0

     
     
     静默接口不会向外发送任何OSPF消息,也不会处理任何OSPF消息,但不影响其他路由器学习去往静默接口所在子网的路由信息OSPF  
     开销值默认接口OSPF开销=带宽参考值/接口链路带宽;串行链路来说,其链路默认带宽为64 Kbit/s,Ospf开销值计算结果如果小于1,最终取值为1;如计算结果如果大于1,只保留整数部分作为开销值,度量不够精确:千兆和百兆接口虽然带宽相差10倍但开销值却是相同为1。OSPF更改AR5 S0/0/1接口的OSPF开销值:
    [AR5]interface s0/0/1
    [AR5-Serial0/0/1]ospf cost 1000

     
     
     带宽参考值如果OSPF域中使用了不同的OSPF带宽参考值,OSPF计算出的路由往往不是最优,默认值为100 Mbit/sOSPFOSPF带宽参考值(取值范围是1~2147483648,默认值为100 Mbit/s)配置:
    bandwidth-reference {value}
     
     单区域OSPF的排错  查看OSPF的进程信息:
    display ospf [process-id] brief
    查看OSPF的接口信息:
    display ospf 12 interface g0/0/0
    查看OSPF的邻居信息:
    display ospf 12 peer brief
    查看OSPF的路由信息:
    display ip routing-table protocol ospf
     
          
    9(这节的内容我不是很理解,有不对的地方尽管指出来)分层结构OSPF网络划分为不同的区域,区域0称为骨干区域所有其他区域必须直接与区域0相连,区域的编号32位用点分十进制或十进制数表示OSPF、区域编号  
     IR内部路由器(Internal Router所有接口在同一个OSPF区域中的OSPF路由器;和区域边界路由器互斥;OSPF路由器类型  
     BR骨干路由器(Backbone Router至少有一个接口被划分到区域0中的OSPF路由器OSPF路由器类型  
     ABR边界路由器(Area Border Router有接口划分到区域0和其他OSPF区域的路由器OSPF路由器类型  
     ASBR自治系统边界路由器(Autonomous System Boundary Router获取OSPF网络之外路由信息的路由器OSPF路由器类型  
     虚链路让非骨干区域能够在逻辑上与骨干区域直接相连或者让骨干区域在逻辑上变得连续的逻辑通道OSPF  
     LSA链路状态通告头部通告路由器ID、类型、链路状态IDLSA头部  
     1路由器LSA通告自己本区域内的直连链路信息,仅在本区域内泛洪,Link ID、ADV Router都是该路由器的RouterIDLSA类型  
     2网络LSA在广播或非广播的网段内选举了DR然后DR在本区域范通告这台DR相连的路由器(路由器ID),仅在本区域内泛洪,Link ID为DR的接口IP地址,ADV Router为DR的Router IDLSA类型  
     3网络汇总LSA边界路由器ABR将一个区域内的网络通告给OSPF中的其他区域,3类LSA保存着本区域以外的所有其他区域的网络LSA类型  
     4ASBR汇总LSAABR通告去往ASBR路由器的主机路由,Link IDASBRRouter ID,这台ABR的Router ID为该LSA的ADV Route,LSA类型  
     5自治系统外部LSAASBR将去往OSPF网络之外其他自治系统网络的路由,通告给这个OSPF自治系统中的所有路由器(跨区域通告)LSALink IDADV Router一直保持不变
    5LSA可以穿越所有区域
    LSA类型  
     7NSSA LSANSSA区域中的ASBR通告将去往OSPF网络之外其他自治系统网络的路由这个NSSA区域中的所有路由器
    NSSA区域不允许外部的路由进来而禁止了5LSA,为了把自己的外部路由传播出去,使用7LSA代替5LSA的功能,当7LSA到达NSSA跟其他区域的边界后,该边界路由器会根据7LSA生成对应的5LSA然后继续传播给其他区域
    LSA类型  
     末节区域(Stub Area)不允许类型4和类型5的LSA进入;ABR通过3LSA向这个区域中通告一条默认路由(0.0.0.0/0)OSPF特殊区域  
     完全末节区域(Totally Stub Area)不允许345LSA进入;ABR通过3LSA向这个区域中通告一条默认路由(0.0.0.0/0)OSPF特殊区域  
     NSSA区域不允许45LSA进入;
    ASBR引入的外部路由置为7LSA在NSSA区域内泛洪;
    ABR将7LSA转换为5LSA
    OSPF特殊区域、7LSA  
    展开全文
    m0_37655876 2019-01-11 16:23:58
  • 子函数的改变要想修改父函数的,必须...}该函数采用传递方式,是单向传递,实参变量和形参变量分别占用不同的存储单元,改变形参变量的不会影响实参变量的,故该函数不能实现对两个变量交换。void Swap_...
    子函数的改变要想修改父函数的值,必须要:
    
    1、传指针 2、解引用
    #include <stdio.h>
    void Swap_eer1(int a,int b)
    {
    int temp;
    temp=a;
    a=b;
    b=temp;
    }
    该函数采用值传递方式,是单向传递,实参变量和形参变量分别占用不同的存储单元,改变形参变量的值不会影响实参变量的值,故该函数不能实现对两个变量值的交换。
    void Swap_err2(int *p1,int *p2)//有传指针,但是没有解引用
    {
    int *tmp=p1;
    p1=p2;
    p2=tmp;
    }
    该函数采用指针传递方式,在该函数中交换的是两个指针形参变量的值,而不是两个指针形参变量所指向的存储单元的值,因此不能影响父函数中变量的值,故该函数不能实现对两个变量值的交换。
    void Swap_err3(int *p1,int *p2)
    {
    int *tmp;//野指针,悬挂指针
    *tmp=*p1;
    *p1=*p2;
    *p2=*tmp;
    }
    该函数采用指针传递方式,是双向传递。理论上能实现两个变量值的交换,但是该函数中应用了指针变量tmp所指向的存储单元作为中间变量,未对指针变量tmp进行初始化,tmp为野指针,它的值为随机值。若tmp指向系统区,改变tmp所指向存储单元的值,有可能造成系统混乱。因此,此函数的设计不可取。
    #include <stdio.h>
    void Swap(int *p1,int *p2)
    {
    int tmp;
    tmp=*p1;
    *p1=*p2;
    *p2=tmp;
    }

    /*该函数采用指针传递方式,是双向传递,通过改变形参指针变量所指向的存储单元(即父函数中的变量)的值,从而影响父函数中变量的值,故该函数能实现了两个变量值的交换*/

    int main()//调用函数,父函数
    {
    int a=10;
    int b=20;
    Swap(&a,&b);//被调用函数,子函数
    printf("a=%d,b=%d\n",a,b);
    return 0;
    }

    调试结果:


    展开全文
    IT_happy_ 2018-04-07 17:25:33
  • 693KB weixin_38661852 2020-05-27 07:31:22
  • blank__box 2016-11-20 23:08:59
  • weixin_46903770 2021-12-15 15:58:24
  • jinhuoxingkong 2016-12-07 13:01:24
  • ouchengguo 2014-04-20 20:36:24
  • 259KB weixin_38670949 2021-05-19 02:48:47
  • hbzhl1 2016-06-24 15:45:43
  • HyJoker 2016-03-13 11:26:25
  • 307KB weixin_38555229 2021-06-13 06:11:47
  • 424KB weixin_38585666 2021-05-19 02:42:10
  • 1.16MB weixin_38640242 2020-04-08 10:04:19
  • guanglizI 2018-05-21 13:21:58
  • weixin_44367041 2019-12-27 23:30:39
  • Alpherkin 2021-10-24 20:10:03
  • qq_33656996 2018-08-16 22:51:06
  • raoqiang19911215 2014-05-19 23:21:45
  • sungaochao 2016-04-06 17:01:37
  • u011727262 2019-10-24 18:34:02
  • qq_42324348 2019-06-12 12:24:36
  • iteye_1485 2013-10-09 11:45:00
  • low666 2019-01-24 18:16:22
  • weixin_45284354 2020-10-05 05:23:55
  • jxw167 2017-05-15 17:49:17
  • zhangdaisylove 2015-10-25 19:38:27
  • qq_37865996 2019-01-13 09:48:13

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 148,768
精华内容 59,507
关键字:

交换值与双交换值