typedef和#define

article/2025/10/11 0:00:15

typedef是c语言中一个重要的关键字其作用是为一种数据类型定义了一个新的名字这里的类型包括(int,char,double 等)和自定义数据类型,通俗一点来说就是为一种数据类型起一个别名

举个例子:

定义一个整型变量a并将其初始化为666,在将a的值输出

#include<stdio.h>
int main()
{int a = 666;printf("%d", a);return 0;
}

如果我想要用datatype代表int 了?也就是我想给int起一个别名这时候我们就可以使用c语言中的关键字typedef了

#include<stdio.h>
typedef int datatype;//注意末尾有分号
int main()
{datatype a = 666;printf("%d", a);return 0;
}

 在这里小伙伴吗可能就会说了我用#define也可以

#include<stdio.h>
#define datatype int 
int main()
{datatype a = 666;printf("%d", a);return 0;
}

 我们可以发现运行结果时一样的,那到底typedef 和#define有什么区别了。下面我们在看一个例子

#include<stdio.h>
#define ptr1 int *int main()
{int a = 0;int b = 1;ptr1 c, d;c = &a;d = &b;}

 很多小伙伴可能认为这个代码没有什么问题但实际上这个代码是有问题的

我们可以看到编译器 报了一个警告这是为什么了。这是因为宏是在预编译期间完成文本替换。ptr1 c,d就相当于int*c,d;这时候d他就是一个整型

但我们在后面把一个整型变量的地址给了一个整型变量。类型不兼容所以编译器才会报了一个警告

那如果我们使用typedef了

我们可以看到编译器连警告都没有了。这是为什么了,这是因为typedef定义了新的数据类型ptr1.

ptr c,d就相当于int *c,*d;

下面我们再来看几个例子:

#include<stdio.h>
typedef int* ptr1;
#define ptr2 int *
int main()
{ptr1 a, b;ptr2 c, d;}

a,b,c,d之中有几个不是指针类型了:相信大家只要看懂了上面的那一个代码马上就知道只有一个不是指针类型那就是d

在上述变量中a,b,c都被定义为int*类型而只有d是int类型,这是因为#define只是做了简单的字符串替换,替换之后就相当于int*c,d;

而typedef 是定义了新的数据类型ptr a,b就相当于int*a,*b;

下面我们在来看一个例子:(有点小坑)

#include<stdio.h>
typedef char* ptr1;
#define ptr2 char*
int main()
{char str[5] = "afff";const ptr1 s1 = str;const ptr2 s2 = str;s1++;s2++;}

以上代码有什么问题了?如果是第一次看到的可以自己思考一下这段代码有什么问题

我们会发现编译器报错了可能有很多小伙伴,有点怀疑是不是编译器错了。编译器为什么会报错了。我们会发现编译器说第九行错了。这是为什么了

这是因为 s1为只读常量。这也在一次提醒我们typedef和#define是不同的。typedef并不是简单的文本替换上述的const ptr1 s1=str并不等价于const char *s1=str;而是等价于char *const s1=str,在这里ptr1是作为一个类型存在的.所以const修饰的是s1对s1进行只读限制所以const ptr1 s1的含义是:限定数据类型为char*的变量s1为只读,所以s1++或报错

总结:

#define 和typedef的区别

#define在预编译期间进行简单的字符串替换。#define的宏定义可以使用#ifdef .#ifndef等进行逻辑判断还可以用#undef取消定义

typedef是为一个类型取一个新的名字,使用typedef定义的变量,其作用范围限制在所定义的函数或者文件内(取决于定义的位置)而宏没有这种特性通常typedef要比#define要好特别是在指针里面

typedef的用途:

1.减少错误

2.直观简洁

3.平台无关性

4.掩饰复合类型

5.代码简化

6.typedef和存储关键字

7.定义指针类型

如果觉得不错的小伙伴可以点个赞!


http://chatgpt.dhexx.cn/article/aN9t8TaK.shtml

相关文章

typedef和define的区别、typedef的具体用法

typedef最核心的用法&#xff1a;给数据类型取别名&#xff0c;这个别名既可以是此数据类型的替换&#xff0c;也是指向此数据类型的指针。 具体用法&#xff08;对普通数据类型取别名&#xff09;&#xff1a; 对结构体数据类型取别名&#xff1a; typedef与define的区别&…

#define与typedef的区别

目录 &#xff08;1&#xff09;原理不同 &#xff08;2&#xff09;功能不同 &#xff08;3&#xff09;作用域不同 &#xff08;4&#xff09;对指针的操作不同 &#xff08;5&#xff09;补充 a.指针常量 b.常量指针 typedef和define都是替一个对象取一个别名&#x…

C语言中的typedef

C语言中的"typedef" 一、什么是typedef typedef是用于定义新的类型名&#xff0c;在编程中可以用typedef来定义新的类型名来代替已有的类型名 格式&#xff1a; typedef 已有类型名 新的类型名 通俗点说&#xff0c;就是为已有的类型取别名&#xff0c;例如 老鼠&am…

define 与typedef的区别

define 与typedef大体功能都是使用时给一个对象取一个别名&#xff0c;增强程序的可读性&#xff0c;但它们在使用时有以下几点区别&#xff1a; 1.定义不一样 define定义后面不用加分号&#xff0c;并且它的别名在对象的前面 typedef需要加分号&#xff0c;并且它的别后面替…

C语言学习笔记---typedef 简介

在单片机和操作系统中 typedef 会经常用到&#xff0c;它可以为某一个类型自定义名称。和#define比较类似。但是又有不同的地方。 typedef 创建的符号只能用于数据类型&#xff0c;不能用于值。而#define 创建的符号可以用于值。typedef 是由编译器来解释&#xff0c;而不是预…

typedef介绍

[20210330更新]&#xff1a;这篇博客写的时间有点久了:)。本次更新修改了博客内容中的错误和表述不当的地方。 本文介绍C语言中的关键字 typedef 的用法。 1 概述 typedef 为C语言的关键字&#xff0c;作用是为一种数据类型定义一个新名字&#xff0c;这里的数据类型包括内部…

【C语言】typedef的使用

目录 一、什么是typedef 二、typedef用法 1、对于数据类型使用例如&#xff1a; 2、对于指针的使用例如 3、对于结构体的使用 三、进阶typedef 1、数组指针 2、指针函数 3、Int *(*array[3])(int); 4、Void (*funA(int,void(*funB)(int)))(int); 四、Typedef与defin…

ubuntu etc 设置权限777带来的问题

ubuntu etc 设置权限777带来的问题--sudoers权限错误 在一次工作中&#xff0c;在ubutu通过命令行输入 sudo chmod -R 777 /etc 命令&#xff0c;误将etc目录权限更改为了777&#xff08;rwxrwxrwx&#xff09; 导致服务器无法ssh远程连接&#xff0c;而且sudo命令无法使用 提…

Linux修改文件权限为777

将文件权限改为777的命令为chmod 777 文件名 777说明&#xff1a; 你可以在linux终端先输入ll,可以看到如: -rwx-r--r-- (一共10个参数) 第一个跟参数跟chmod无关,先不管. 2-4参数:属于user 5-7参数:属于group 8-10参数:属于others 接下来就简单了:r>可读 w>可写 x&…

文件权限777

一个文件的权限为777(linux中 ls -l xxx.xxx &#xff08;xxx.xxx是文件名,查看的是xxx文件之中的文件权限)) 这三个数字分别表示&#xff1a;不同用户或用户组的权限。 第一个数字表示文件所有者的权限 第二个数字 表示与文件所有者同属一个用户组的其他用户的权限 第三个数…

Linux-权限管理(你听过777、755、644吗)

文章目录 组rwx权限修改权限-chmod修改文件所有者-chown修改文件所在组-chgrp 组 linux 中每个文件有所有者、所在组、其它组的概念。 类似linux 中的每个用户必须属于一个组&#xff0c;不能独立于组外&#xff0c;组的相关操作可参考&#xff1a;Linux-用户管理 所有者 文件…

Linux文件属性的777权限

一、文件属性概述 Linux系统是一种典型的多用户系统&#xff0c;不同的用户处于不同的地位&#xff0c;拥有不同的权限。为了保护系统的安全性&#xff0c;Linux系统对不同的用户访问同一文件&#xff08;包括目录文件&#xff09;的权限做了不同的规定。在Linux中我们可以使用…

Linux的777权限

Linux的每个文件一般都有三个权限 r–读&#xff0c;w–写&#xff0c;x–执行&#xff0c;其分别对应的数值为4&#xff0c;2&#xff0c;1。 输入ll可以查看到文件的权限。 聪明的同学已经看出来了——7即代表有读、写和执行的权限。那么为什么是三个7呢&#xff1f;“三”是…

Linux 777 权限表示什么,各数字又是什么含义?

最近在面试中&#xff0c;问到了 Linux 777 权限表示什么&#xff0c;各数字的含义又是什么。小格子通过自己的理解和查找的资料&#xff0c;做了如下总结&#xff0c;希望读者们遇到此问题时&#xff0c;可以快速又正确的回答。 1、三种权限 Linux 下的每个文件都有以下三种…

C语言移位运算(<<)

上来个题目给大家感受下 解题 #include<stdio.h> int main() {int x;while(scanf("%d",&x)!EOF){printf("%d\n",1<<x);}return 0; } 输出结果 其他&#xff1a; 运算符含义 运算符含义描述<<左移二进制数左移x位&#xff0c;高…

为什么我的C语言移位操作达不到效果??

为什么我的C语言移位操作达不到效果&#xff1f;&#xff1f;&#x1f632;&#x1f632; 今天下午在对蓝牙数据处理的时候发现&#xff1a; wrwr<<8read_Buffer[2];write(44,wr,0); 达不到预期效果&#xff1b;但把上述代码改为wrwr*256read_Buffer[2];write(44,wr,0…

C语言之移位操作符、位操作符详解

目录 1、移位操作符 2、位操作符 1、移位操作符 分为左移操作符&#xff08;<<&#xff09;和右移操作符(>>)。 左移操作符&#xff1a; 移位规则&#xff1a;左边抛弃&#xff0c;右边补0。 什么意思呢&#xff0c;现在就让我来仔细讲解一番。 比如我们定义…

整数乘法c语言移位实现,C语言 用移位、异或、与运算实现加法

C语言 用移位、异或、与运算实现加法 一、说明 计算机整数的加减乘除就是依靠位运算实现的。 比如整数的运算&#xff1a;加法&#xff1a;通过异或、与、移位实现&#xff1b;减法&#xff1a;a-b其实就是a(-b);乘法&#xff1a;5*3其实就是555&#xff1b;除法&#xff1a;7/…

C语言移位操作之增删对应比特位

在实际开发中&#xff0c;常常用移位操作代替乘除法&#xff0c;因为一般情况下&#xff1a; 1.从效率上看&#xff0c;使用移位指令有更高的效率&#xff0c;因为移位指令占2个机器周期&#xff0c;而乘除法指令占4个机器周期。 2.从硬件上看&#xff0c;移位对硬件更容易实…

C语言移位操作遇到的问题和解决办法

最近在调试一个Camera ISP OTP校准的问题&#xff0c;在开发过程中&#xff0c;要将2个字节的数据组合成16bit的数据。一开始我以为只要是一大块内存&#xff0c;我们告诉它类型&#xff0c;那么编译器就会自动分配对应的内容。例如&#xff1a;下面图1中连续的内容&#xff0c…