简单聊一下const

问题索引:

1.为什么要存在这种东西?

2.它有什么样的作用?

3.与define 有什么联系?

4.C与C++中的const有什么区别?

5. C++ 11 中又有了些什么新的东西?

解:

1.为什么要存在这种东西?就是为了避免程序员在编程时,手残修改关键部分的值(其实想一想内核为什么会分内核态和用户态,类中为什么要有public和private也就明白了)

2.它有什么样的作用?其实说的简单点就是保护被修饰的东西,防止意外的修改

3.与define 有什么联系?他们的底层实现是如何的?其实这是一个最不好回答的问题。我就简单的从内存方面来叙述一下

联系:

define – 不分配内存,给出的是立即数,只是简单的替换。有多少次使用就进行多少次拷贝替换,在内存中会有多个拷贝,消耗内存大

const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝

更多的戳这里和那里:这里
那里

4.C与C++中的const有什么区别?

C中的const

1.C中的const修饰的是只读变量,还是变量,只是不可写

2.有两种改变变量的值:(1)直接赋值的形式(2)通过指针

const  m= 10;   //m 的值不能在程序中被修改(但可以通过指针改变它)
const char *p; //*p不能变,即通过指针无法改变变量的值
char const *p;  //同上,只是形式不同而已
char *const p;  //p不能变,即**指针p的指向**被固定,也就是说,指针这个变量只能存储指向变量的值。
const char *const p; //*p 和p同时不能变 

举例验证:

1.代码:
#include<stdio.h>
int main(void)
{
    /*const 19;  //修饰了常量*/
    const int m = 10;
//    m= 11;  //1.c:13:6: 错误:向只读变量‘m’赋值
    int *p_m = &m ; //1.c:14:16: 警告:initialization discards ‘const’ qualifier from pointer target type
    *p_m = 999999;
    printf("m ==  %d \n",m);   //通过指针就可以改变它的值
    return 0;
}

这里写图片描述

2.代码:
#include<stdio.h>
int main(void)
{
    /*int m= 10;
    const int *p ;
    p=&m; 
//    *p= 1111; //1.c:14:7: 错误:向只读位置‘*p’赋值
    m= 22222;  //直接赋值的形式可以改变它的值
    printf("const int *p的情况:  m == %d \n",m);*/



    int n = 50;
    int temp = 0;
    int *const  p=&n ;
    p=&temp ; //1.c:26:6: 错误:向只读变量‘p’赋值     
    return 0;
}

注意只读变量‘p’与只读位置‘*p’ 的差别!!!!
记法:左定值,右定向。
解释:
const 在(*变量)的左边,即:const  int  *p .就不能通过(*p)来改变它的值。
const 在(*变量)的右边,即: int *const p .就不能改变指针的指向。

C++中的const

1. const对象必须初始化 ,比如:const int k ;就是错误的

2.默认状态下,const对象仅在本文件内有效。如果要在其他文件中也要使用该对象,需要使用extern来声明

3.常量引用(不是一个对象):C++一般不允许改变引用所绑定的对象(其实引用就是给这个对象起了一个新名字,其实就是一个硬链接)但是绑定的这个对象是不是const型就没有什么太大的关系了,如果是const,那就它所参与的运算不能改变它的值,如果不是,那就可以改变它的值。但是引用与对象之间的关系又不会被改变~_~

4.指针是一个对象,它又可以指向另一个对象,那么指针可以是常量,指针指向的对象也可以是常量。顶层const就是指针本身是一个常量,底层const表示指针指向的对象是一个常量。

链接学习:这里写链接内容

这里写链接内容

5.C++ 11 中又有了些什么新的东西?

1.常量表达式:值不会改变,在编译过程中就能得出结果的表达式
2.constexpr :规定该类型就可以告诉编译器去验证变量的值是不是一个常量表达式。声明为该类型的变量一定时一个常量,必须用常量表达式来初始化。
TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议,它是基于UDP协议实现的,通常用于在网络上传输小文件。TFTP协议具有以下特点: 1. TFTP协议是一种无状态协议,每次传输都是独立的,不需要建立长连接或会话。 2. TFTP协议使用UDP协议进行数据传输,因此具有较低的传输延迟和较高的灵活性。 3. TFTP协议支持两种传输模式:ASCII模式和二进制模式。ASCII模式用于传输文本文件,二进制模式用于传输二进制文件。 4. TFTP协议支持两种操作:读操作和写操作。读操作用于从远程主机获取文件,写操作用于向远程主机传输文件。 下面是一个用C语言实现TFTP协议的简单例程,该例程演示了如何使用lwIP库实现TFTP协议的文件传输功能: ```c #include "lwip/udp.h" #include "lwip/tftp.h" // TFTP传输完成回调函数 void tftp_callback(void *arg, const char *filename, u32_t size, tftp_result_t result) { if (result == TFTP_RESULT_OK) { printf("TFTP传输成功,文件名:%s,文件大小:%lu\n", filename, size); } else { printf("TFTP传输失败,错误码:%d\n", result); } } // TFTP传输函数 void tftp_transfer(const char *host, const char *filename, tftp_mode_t mode) { struct udp_pcb *pcb; struct ip_addr remote_ip; struct tftp_connection_args args; // 解析远程主机IP地址 if (ipaddr_aton(host, &remote_ip) == 0) { printf("无法解析远程主机IP地址:%s\n", host); return; } // 创建UDP协议控制块 pcb = udp_new(); if (pcb == NULL) { printf("无法创建UDP协议控制块\n"); return; } // 设置TFTP连接参数 args.remote_ip = remote_ip; args.remote_port = TFTP_PORT; args.blksize = TFTP_BLKSIZE; args.retries = TFTP_MAX_RETRIES; // 发起TFTP传输 if (tftp_get(pcb, &args, filename, mode, tftp_callback, NULL) != ERR_OK) { printf("无法发起TFTP传输\n"); udp_remove(pcb); return; } } int main() { // 从远程主机下载文件 tftp_transfer("192.168.1.100", "test.txt", TFTP_MODE_NETASCII); // 向远程主机上传文件 tftp_transfer("192.168.1.100", "test.bin", TFTP_MODE_OCTET); return 0; } ``` 在上述例程中,我们首先定义了一个`tftp_callback`回调函数,该函数用于在TFTP传输完成后进行回调,输出传输结果。然后我们定义了一个`tftp_transfer`函数,该函数用于发起TFTP传输,其中使用了lwIP库中提供的`tftp_get`函数和`tftp_put`函数,分别用于下载和上传文件。最后,在main函数中我们演示了如何使用`tftp_transfer`函数进行文件传输。需要注意的是,在实际使用中,我们需要根据具体的应用场景来调整TFTP连接参数,以确保传输的可靠性和效率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值