关于typedef

本文通过两个C++代码示例对比,解释了在使用const关键字修饰指针时的区别,特别是针对const的位置不同所带来的含义变化,即const修饰的是指针所指向的内容还是指针本身。
//下面这个代码是无法编译的
typedef char* PSTR;

int mystrcmp(const PSTR, const PSTR)
{
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
        char const *  p1 ="a";
        char const *  p2 ="b";
        mystrcmp(p1, p2);
	return 0;
}



//下面的代码是可以编译的

typedef char* PSTR;

int mystrcmp(const PSTR, const PSTR)
{
    return 0;
}

int _tmain(int argc, _TCHAR* argv[])
{
        char * const p1 ="a";
        char * const p2 ="b";
        mystrcmp(p1, p2);
	return 0;
}
const PSTR实际上相当于const char*吗?不是的,它实际上相当于char* const。
原因在于const给予了整个指针本身以常量性,也就是形成了常量指针char* const。



记住,typedef是定义了一种类型的新别名,不同于宏,它不是简单的字符串替换。

<think>好的,我现在需要解决这个关于typedef的选择题。题目是找出不正确的叙述,选项有四个:A、B、C、D。首先,我得回顾一下typedef的基本知识,然后逐一分析每个选项是否正确。 首先,typedef在C语言中的作用是为已有的类型定义一个新的名字,也就是别名。它并不创建新的数据类型,只是给现有的类型一个不同的名称,这样做的目的通常是为了提高代码的可读性和可移植性。例如,typedef unsigned int UINT; 这样UINT就是unsigned int的别名,但并没有新类型被创建。 接下来看选项: A选项说“用typedef可以定义各种类型名,但不能用来定义变量”。这里前半部分是正确的,因为typedef确实可以定义各种类型的别名,包括结构体、指针等。后半部分是否正确呢?因为typedef本身的作用是定义类型别名,而不是变量,所以定义变量的时候还是需要像通常那样声明变量,比如使用定义好的别名来声明变量,但typedef本身不能直接定义变量。所以A应该是正确的。 B选项说“用typedef可以增加新数据类型”。这里是否正确呢?根据之前的知识,typedef只是给现有类型起别名,而不是创建新类型。比如,typedef int MyInt; MyInt还是int类型,并没有新增类型。所以B的说法是错误的,应该是不正确的选项。 C选项说“用typedef只是将已存在的类型用一个新的名称来代表”。这完全正确,因为typedef的作用就是给已有类型起别名,没有创建新类型,所以C正确。 D选项说“使用typedef便于程序的通用和移植”。这也是正确的,因为通过typedef,可以隐藏平台相关的类型细节。例如,用typedef定义int32_t这样的类型,在不同平台上可以有不同的实现,但代码中使用的是统一的类型名,这样在移植时只需要修改typedef的定义,而不需要改所有代码。因此D正确。 所以,错误的选项是B选项,因为它错误地声称typedef能增加新数据类型,而实际上并没有这个功能。其他选项都正确描述了typedef的用途和特性。 不过,再仔细检查一下有没有可能哪里理解错了。比如,是否有情况下typedef会间接导致新类型的创建?比如结构体的情况。例如: typedef struct { int x; } NewType; 这里NewType是一个结构体类型的别名,但结构体本身是已经存在的类型吗?其实这里struct是定义了一个新的结构体类型,然后typedef给它一个别名。所以在这种情况下,结构体类型是新的,但typedef只是给这个新类型一个名字,而不是typedef本身创建了类型。结构体的定义才是创建新类型的关键,而typedef只是命名。因此,B选项仍然不正确,因为typedef本身并不增加新类型,而是结构体的定义在增加新类型,而typedef只是命名。 所以最终结论,选项B是不正确的。</think>关于typedef的叙述,**不正确的选项是B**。以下是详细分析: --- ### 核心区别(表格对比) | 选项 | 正确性 | 关键原因分析 | |------|--------|--------------| | **A** | 正确 | `typedef` **仅定义类型别名**,变量需通过类型名另行声明(如 `MyType var;`) | | **B** | **错误** | `typedef` **不会创建新类型**,仅对现有类型重命名(例如 `typedef int MyInt` 中 `MyInt` 仍是 `int` 类型) | | **C** | 正确 | 直接体现了 `typedef` 的本质功能(语法糖作用) | | **D** | 正确 | 通过统一类型别名可提升跨平台兼容性(如 `typedef long int32_t` 适配不同系统) | --- ### 关键概念解析 #### 1. `typedef` 的核心作用 - **类型别名**:为现有类型提供更直观/简短的名字 ```c typedef unsigned char uint8; // uint8 即 unsigned char ``` - **不改变类型本质**:编译时会被替换回原类型,**无新类型生成** #### 2. 选项B错误的具体体现 - **反例验证**: ```c typedef float Velocity; Velocity v = 3.14; printf("%zu", sizeof(v)); // 输出4(与float完全一致) ``` - `Velocity` 本质仍是 `float`,未新增数据类型 --- ### 进阶应用场景 #### 典型用法(证明选项D正确) ```c // 跨平台兼容性设计 #if defined(WIN32) typedef __int64 int64_t; #else typedef long long int64_t; #endif int64_t counter; // 代码无需修改即可移植 ``` #### 与结构体的结合(说明选项B局限) ```c typedef struct { int x,y; } Point; // 结构体定义实际创建了新类型 ``` - **注意**:此时的新类型由 `struct` 定义产生,`typedef` 仅负责命名,**不创建类型本身** --- ### 易混淆点总结 | 误区 | 正解 | |------|------| | "typedef可以扩展类型系统" | `typedef` **仅重命名**,类型系统由编译器固有类型+用户定义结构体/联合体等决定 | | "typedef和#define等价" | `#define` 是文本替换,`typedef` 是类型别名(有类型检查) | 选择 **B** 错误的原因是混淆了 **类型定义**(如 `struct`)与 **类型别名**(`typedef`)的本质区别。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值