【C功能体】关键字:typedef、const与define

【C语言 C++】简单关键字Register,Const,Static,Volatile,typedef,Define的理解 Register     用register声明的变量称着寄存器变量,在可能的情况下会直接存放在机器的寄存器 中;但对32位编译器不起作用,当global optimizations(全局优化)开的时候,它会做出 选择是否放在自己的寄存器中;不过其它与register关键字有关的其它符号都对32位编译 器有效。 Const      被const修饰的东西都受到强制保护,可以预防意外的变 阅读详情

本文主要讲解:

  • typedef在基础数据类型、在指针、在结构体、在指向结构体的指针、在枚举类型的用法;
  • const和define语法和本质区别,用法注意事项;

 


typedef

1、typedef为各种数据类型定义一个新名字。

#include<stdio.h>
typedef int Interger;
typedef unsigned int UInterger;
typedef float Float;
int main()
{
	Interger i = -1;
	UInterger ui = 1;
	Float f = 12.33f;
	printf("%d %d %.2f", i, ui, f);
}

2、typedef与指针

#include <stdio.h>

typedef char *String;

int main(int argc, const char * argv[])
{
	// 相当于char *str = "This is a string!";
	String str = "This is a string!";
	printf("%s", str);
	return 0;
}

3、typedef与结构体

#include<stdio.h>

struct MyPoint
{
	float x;
	float y;
};

typedef struct MyPoint point; //起别名
int main()
{
	struct MyPoint p;
	p.x = 10.0f;
	p.y = 20.0f;

	point pp;
	pp.x = 10.0f;
	pp.y = 20.0f;

	return 0;
}

// 定义一个结构体,顺便起别名
typedef struct MyPoint {
	float x;
	float y;
} Point;

//甚至可以省略结构体名称:
typedef struct {
	float x;
	float y;
} Point;

4、typedef与指向结构体的指针

#include <stdio.h>

// 定义一个结构体并起别名
typedef struct {
	float x;
	float y;
} Point;

// 起别名
typedef Point *PP;

int main(int argc, const char * argv[]) {
	// 定义结构体变量
	Point point = { 10, 20 };

	// 定义指针变量
	PP p = &point;

	// 利用指针变量访问结构体成员
	printf("x=%f,y=%f", p->x, p->y);
	return 0;
}

5、typedef与枚举类型

// 定义枚举类型
enum Season { spring, summer, autumn, winter };
// 给枚举类型起别名
typedef enum Season Season;

int main(int argc, const char * argv[]) {
	// 定义枚举变量
	Season s = spring;
	return 0;
}
// 定义枚举类型,并且起别名
typedef enum Season {spring, summer, autumn, winter} Season
甚至可以省略枚举名称,简化为:
typedef enum {spring, summer, autumn, winter} Season;

6、typedef与指向函数的指针

#include <stdio.h>

// 定义一个sum函数,计算a跟b的和
int sum(int a, int b) {
	int c = a + b;
	printf("%d + %d = %d", a, b, c);
	return c;
}

//给指向函数的指针类型,起了个别名叫MySum,被指向的函数接收2个int类型的参数,
//返回值为int类型。
typedef int(*MySum)(int, int);

int main(int argc, const char * argv[]) {
	// 定义一个指向sum函数的指针变量p
	//int (*p)(int, int) = sum; //原始
	MySum p = sum; //使用了typedef后

				   // 利用指针变量p调用sum函数
	(*p)(4, 5);

	return 0;
}

const和define

 

一句话说明白它们之间的区别:const是定义一个不可再变的量(常量),define是为一个变量或表达式定义一个别名,在使用时替换成变量或表达式。

 

const

  1. 本质上来说,const修饰的是假常量,它本质还是变量!只不过编译器不让你修改!const 是 constant 的缩写,意思是“恒定不变的”!
  2. const一般修饰于定义变量的前面,比如cosnt int a = 10,意味着a就一直是19,是一个不可修改的变量了。往后试图给a重新赋值都会引发错误。这就是const修饰之后的结果,但请注意,这里不可修改的原因其实是编译器在做检查,检查是否有修改这块内存上的值,一旦有就会报错,所以从根本上说,cosnt修饰的变量依然是一个变量!只不过编译器不让你修改而已!
  3. 用const float MAX = 255; 定义的常量有类型名字,存放在内存的静态区域中,在程序运行过程中const变量只有一个拷贝
  4. const是不可以定义函数的
  5. 用const定义的常量是可以用指针去指向该常量的地址的;

 

define

  1. 本质上来说,define修饰出来的是常量!并且是真常量!
  2. 为什么说define修饰出来的是真常量呢?因为,define是宏定义,是宏替换,意味着程序在编译前期会进行文本替换,例如代码define PI 3.1415926 这句话,编译器会将代码中所有出现PI的地方全部用3.1415926替换,然后在进行编译,所以本质它就是一个常量!
  3. 用#define MAX 255定义的常量是没有类型的,所给出的是一个立即数,编译器只是把所定义的常量值与所定义的常量的名字联系起来,define所定义的宏变量在预处理的时候进行替换,在程序中使用到该常量的地方都要进行拷贝替换;#define 所定义的宏变量却有多个拷贝,所以宏定义在程序运行过程中所消耗的内存要比const变量的大得多;
  4. 用define可以定义一些简单的函数
  5. 用define定义的常量是不可以用指针变量去指向
const与指针
const int* p;   //p可变,p指向的对象不可变
int const* p;  //p可变,p指向的对象不可变

int* const p;  //p不可变,p指向的对象可变
const int* const p;  //指针p和p指向的对象都不可变

编译器处理方式不同

  • define – 在预处理阶段进行替换
  • const – 在编译时确定其值
  •  
  • define是宏定义,程序在预处理阶段将用define定义的内容进行替换,因此程序运行时常量表中并没有用define定义的常量,系统不为其分配内存。
  • const常量是编译运行时的常量,系统为其分配内存。

类型与安全检查不同

  1. define – 无类型,不进行类型安全检查,可能会产生意想不到的错误(边际效应)
  2. const – 有数据类型,编译时会进行类型检查
define注意“边际效应”。

例:

#define N 2+3 //N的值是5

int a = N/2; //在编译时预想a=2.5,实际打印结果是3.5原因是在预处理阶段,编译器将a=N/2处理成a=2+3/2,这就是define宏的边际效应;所以我们应该写成#define N (2+3)

存储方式不同

  1. define – 不分配内存,给出的是立即数,有多少次使用就进行多少次替换,在内存中会有多个拷贝,消耗内存大
  2. const – 在静态存储区中分配空间,在程序运行过程中内存中只有一个拷贝,const可以节省空间,避免不必要的的内存分配

其他

  1. 在编译时, 编译器通常不为const常量分配存储空间,而是将它们保存在符号表中,这使得它成为一个编译期间的常量,没有了存储与读内存的操作,使得它的效率也很高。
  2. define是宏定义,程序在预处理阶段将用define定义的内容进行替换,因此程序运行时常量表中并没有用define定义的常量,只作替换,不做计算,不做表达式求解。
#include <stdio.h>
#define N 10  //将代码中出现N的地方全部替换为10

int main()
{
	const int a = 10; //const强调不变性
	//a = 20;  报错!

	printf("%d, %d", N, a);
	return 0;
}

 

【达梦8】多实例监视集群的部署测试 确认监视器具有状态确认和自动接管两个功能。在数据守护系统的故障自动切换模式下,必须部署一个确认监视器,否则在出现数据库故障时,会导致数据库服务中断。DM 提供了两种确认监视器的配置形式,分别为单实例和多实例。但是当单实例确认监视器故障时,无法继续进行集群的故障自动接管和备库故障确认,影响正常使用,故提供了多实例确认监控器来进一步提高集群的高可用性。在多实例确认监视器中,只有一个实例作为确认监视器提供服务,其它实例作为备库存在而不提供服务。 阅读详情

相关推荐

从零构建:如何用MATLAB工具箱打造你的第一个多体动力学仿真模型

本文详细介绍了如何使用MATLAB的Simscape Multibody工具箱从零开始构建多体动力学仿真模型,特别适合初学者学习倒立摆系统的建模与仿真。文章涵盖环境准备、坐标系设置、物理模型构建、参数化建模及性能优化等关键步骤,帮助工程师快速掌握这一强大的仿真工具。

water的专栏 964

const定义常变量

C++提供了const关键字来定义一个“常量”,例如,我们定义一个变量,变量中的数据不可以被修改,那么,可以使用const关键字声明变量,定义变量是“常量”类型。例如: const float PI = 3.14159; 定义了常变量PI,它具有变量的属性,有数据类型,占用存储单元,有地址,可以使用指针指向它,只是,在程序运行期间,这个常变量的值是固定的,不能改变。 所以,在C++编程中,都使用const来取代了用 #define 定义符号常量的作用。一般把程序中不允许改变值的变量定义为...

LC的专栏 4860

React项目实战:用AntV G6打造可折叠组织架构图(附完整代码)

本文详细介绍了如何在React项目中使用AntV G6库构建一个功能完整的可折叠组织架构图。通过实战代码演示了从环境搭建、自定义节点、折叠状态管理到性能优化的全流程,重点解决了企业级应用中处理复杂树形数据、实现流畅交互等核心问题,并提供了可直接复用的组件代码。

weixin_29016315的博客 312

C语言中const float,C语言中的const修饰与宏定义的区别辨析

(1) 编译器处理方式不同define宏是在预处理阶段展开。const常量是编译运行阶段使用。(2) 类型和安全检查不同define宏没有类型,不做任何类型检查,仅仅是展开。const常量有具体的类型,在编译阶段会执行类型检查。(此也是const优于define的一点:可以进行类型检查,意味着会降低因数据类型问题导致的程序BUG)(3) 存储方式不同define宏仅仅是展开,有多少地方使用,就展开...

weixin_29009501的博客 2694

【Java微服务-医疗管理项目】(附源码+资料+教程)

尚医疗是专门为各大医院、门诊提供的一款医疗管理平台。 系统包含:系统管理、药品进销存管理、看病就诊、收费管理、检查管理、数据统计等核心模块。 通过尚医疗系统可以快速、方便的管理病人从挂号到门诊结束所涉及到的全套流程。也可以清晰明了的体现出药品进货、出售的所有记录。.........

m0_72882572的博客 2203

(蓝桥杯)STM32G431RBT6(SysTick timer)

选用最基础的定时器。

2301_81764359的博客 1899

const float *p 与float * const p的区别

const float *p是指p是常量指针,指向float常量或者变量,但是可以改变指向; float *const p 代表p可以指向变量,但是声明指定后就不能再改变 用例子说明 const float f=0.1,f2=1.1; const float * pf=&f; printf("%f",*pf);//0.1 f=0.2;//错误,不可改变f的值 pf=&f2;

问路的博客 1万+

ABAP 7.40+新语法实战:用VALUE和REDUCE五分钟搞定复杂内表统计

本文详细介绍了ABAP 7.40+新语法中的VALUE和REDUCE操作符,如何高效处理复杂内表统计任务。通过实战案例展示,这些新语法能将代码量减少70%以上,显著提升开发效率和可读性,特别适合大数据量下的销售数据分析、分组统计等场景。

weixin_27219587的博客 206

C++易错知识点笔记(一)const关键字

一,const常量 const的意思是常量 const float PI=3.14; PI=3;//会报错,PI不可修改 注意 1,常量定义以后不能再继续赋值,所以在定义时最好顺便初始化。 2,常量不能赋值的确切意思是不能在编译过程中赋值,而不是说在运行过程中不能赋值。在运行过程中如果通过操作指针,同样可以对该变量赋值,但一般用不上这种操作,如下:通过该例子再体会一下指针直接修改内存的作用。 float* p=(float*)&PI; float input; cin>>input;

weixin_42445051的博客 895

华为云计算——FusionCompute创建虚拟机

华为云计算——FusionCompute创建虚拟机

jks212454的博客 3675

电源防反接保护电路全攻略实战A04

本文深入剖析了硬件设计中电源保护电路的关键技术与实战经验。文章指出,保护电路虽小但至关重要,通过对比分析二极管与MOSFET防反接方案,揭示了MOSFET在效率、温控方面的优势。针对过压保护,重点讲解了TVS二极管选型要点,强调钳位电压而非击穿电压才是保护核心。文章结合工业案例(如48V通信模块烧毁、5V系统MOSFET过热等),详细阐述了PCB布局规范、热设计路径等工程细节,并提供了USB接口ESD防护的完整选型方案。最后强调硬件设计必须考虑最坏工况,在成本与性能间找到平衡点,避免因小失大。

启芯硬件的博客 776

【C++知识点整理: 03const与浮点数】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录前言一、const限定符1、创建常量2、常量的命名规则二、浮点数1、浮点数的机制2、浮点数的书写3、浮点类型4、浮点常量5、浮点数的缺点 前言 提示:const与浮点数的复习: 一、const限定符 与C相比,C++增加了const限定符来更好的处理符号常量, 1、创建常量 通用格式如下: const type name = value; 代码如下(示例): const int Months = 12; 常量被初始化后编译.

qq_39544982的博客 1437

Python3实现基于ARIMA模型来预测茅台股票价格趋势

ARIMA(Autoregressive Integrated Moving Average)模型是一种广泛使用的时间序列分析方法,它可以用于对未来的数据进行预测。ARIMA模型由自回归模型(AR模型)、差分整合模型(I模型)和移动平均模型(MA模型)组成,因此也被称为ARIMA(p,d,q)模型。其中,p表示自回归阶数,d表示差分阶数,q表示移动平均阶数。具体来说,ARIMA模型可以通过以下步骤进行建模:数据预处理:对时间序列进行平稳性检验,如果不满足平稳性,则进行差分操作。

m0_64336780的博客 2万+

C语言复习 —— const define typedef

1. const 关键字 2. define 宏定义 3. typedef的用法 3.1 typedef和const结合的陷阱 3.2 define和typedef的区别 3.3 typedef与结构体的练习

不善挽留 801

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

C++中define、typedef、inline、const和constexpr的区别

constexpr 只能定义编译期常量,⽽ const 可以定义编译期常量,也可以定义运⾏期常量。相较于const,constexpr 可以用于数组大小、模板参数等要求编译期确定的场景。// 运行时和编译期皆可用// 仅编译期可用// 可能编译错误(如果 x 不是编译期常量)// 编译成功C++ 中更推荐使用 const 或 constexpr 替代常量宏,使用 inline或constexpr 替代宏函数。

qq_45927005的博客 1717

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

C语言中typedef关键字

与define定义宏不同,typedef这个关键字的本质是做类型重命名,由使用者自己定义一个新的类型。 所以我们可以自己定义新的类型: #include<stdio.h> typedef unsigned int u_int; typedef int* int_p; typedef int a[10];//a是一种数组类型 typedef struct stu { char name[20]; int age; }stu_t; int main() { u_int x = 0; int_

精致的灰的博客 3589

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【C/C++面试题】const、define、extern、typedef、volatile、static的定义与区别

文章目录constdefineexterntypedefstaticvolatileconst与#define相比,有何优点?typedef和define有什么区别C 语言的关键字 static 和 C++ 的关键字 static 有什么区别一个指针可以是 volatile吗?const和volatile可以同时修饰一个变量吗? const const用来定义一个只读的变量或对象。 主要优点:便于...

zhong_senvi的博客 709

C专家编程精华篇----头疼的C语言声明:const、typedef、define及函数高级声明

**************const有关的变量声明***************** (1)const == read-only const修饰的变量被许多人错误的认为是常量,但是const所修饰的变量应该是只读变量 检验这个结论可以用下面这个方法: const int two = 2; switch(i) { case 1: printf("case 1.\n"); case tw

fengxiaoke_fxk的专栏 1万+

在C语言中 typedef,const,define的区别是什么?

1.typedef typedef为C语言的关键字,作用是为一种数据类型定义一个新名字。这里的数据类型包括内部数据类型(int,char等)和自定义的数据类型(struct等)。 在编程中使用typedef目的一般有两个,一个是给变量一个易记且意义明确的新名字,另一个是简化一些比较复杂的类型声明。 2.const 主要作用:用来修饰变量,表示该变量是只读变量,而不是常量,可以修改。 例如: con...

HU1656的博客 603

const、define、extern、typedef、volatile、static的定义与区别

这个函数只需要将src字符串拷贝给dest就好了,只需要只读,不需要改变,一旦在函数在定义的时候,一旦改变了*src,那么编译器会直接的报错。注意:编程时 static 的记忆性,和全局性的特点可以让在不同时期调用的函数进行通信,传递信息,而 C++的静态成员则可以在多个对象实例间进行通信,传递信息。volatile的作用是告知编译器,它修饰的变量随时都可能被改变,因此,编译后的程序每次在使用该变量的值时,都会从变量的地址中读取数据,而不是从寄存器中获取。const主要的用途是函数传参的时候,修饰形参的。

番茄的博客 880

面试 校招 得物下头面试 const 关键字的作⽤ define 和 typedef 的区别 define 和 inline 的区别

今天,我遇到了一个超级下头的面试官,真的是让人大开眼界👀。评论区的小伙伴们也是各种反应,有的说不开摄像头的面试基本都是KPI面试,有的分享了自己的经历,说不开摄像头也拿到了offer,还有的说面试官不开摄像头可能是因为其他原因。声明指向常量的指针,表示指针所指向的值是常量,不能通过指针修改。声明常量引⽤,表示引⽤的值是常量,不能通过引⽤修改。是先将内联函数编译完成⽣成了函数体直接插⼊被调⽤的地⽅,减少了压栈,跳转和返回的操作。定义预编译时处理的宏,只是简单的字符串替换,⽆类型检查,不安全。

2301_76281042的博客 1194

八股文 C++ 关键字define/typedef define/inline const/define constexpr new和malloc constexpr volatile extern

1.简单的替换,没有类型检查;2.在预处理阶段起作用;3.可用来防止头文件重复利用;4.不分配内存,有多少次使用就进行多少次替换。

weixin_46930685的博客 787

搬运工--C关键字union/const/define/typedef/extern/volatile

Volilatile Wiki Volatile 变量 通常,volatile关键字用来阻止(伪)编译器对那些它认为变量的值不能“被代码本身”改变的代码上执行任何优化。 Kerner Document  Why the "Volatile" type class should not be used The key point to understand with rega

学习点滴 1227

C语言声明:const、typedef、define及函数高级声明

转载自:http://blog.youkuaiyun.com/fengxiaoke_fxk/article/details/7688031 **************const有关的变量声明***************** (1)const == read-only const修饰的变量被许多人错误的认为是常量,但是const所修饰的变量应该是只读变量 检验这个结论可以用下面这个方

yadon_z的专栏 623

define、typedef、const、typedef struct 用法详解

一、typedef的用法 在C/C++语言中,typedef常用来定义一个标识符及关键字的别名,它是语言编译过程的一部分,但它并不实际分配内存空间,实例像: typedef int INT; typedef int ARRAY[10]; typedef (int*) pINT; typedef可以增强程序的可读性,以及标识符的灵活性,但它也有“非直观性”等缺点。 二、#define的用法 #define为一宏定义语句,通常用它来定义常量(包括无参量与带参量),以及用来实现那些“表面似和善、背后一长串”的宏,

2442

C语言--typedef,define,const,typeof的使用

在 C 语言中, 关键字用于为已有的数据类型创建一个新的名称。这使得代码更具可读性。这里主要讲一下typedef,define,const,typeof 的使用

XINGXIN 903
上一篇: 【C功能体】C语言的函数语法和特性
下一篇: 【线性表】顺序表的基本特性
ALGO阿狗
博客等级 码龄9年 64粉丝 149原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值