C语言中,#define和typedef 定义int* 一个容易混淆的点

devtools/2025/3/21 9:10:59/

前言

        首先来看一个代码:

#include <stdio.h>
#include <string.h>#define int_ptr int *int main() {int c = 100;int_ptr a , b;		// 等效于int * a,b; 那么b就是int类型,不是int*类型a = &c;b = &c;	//报错return 0;
}

原意,我本来想让a 和 b都是int *类型,但是发现并不是。

这段代码的主要问题在于宏定义和指针声明的使用方式上:

  • 当使用 #define int_ptr int * 时,在声明 int_ptr a, b; 时会被展开为 int * a, b;
  • 这种展开方式导致:
  • a 被声明为 int 指针类型 (int)
  • b 被声明为 int 类型(而不是指针类型)
  • 因此当你试图将地址赋值给 b 时会报错,因为 b 不是指针类型

代码优化1:使用typedef

#include <stdio.h>
#include <string.h>typedef int* int_ptr;    // 使用 typedef 定义指针类型int main() {int c = 100;int_ptr a, b;        // 现在 a 和 b 都是 int* 类型a = &c;b = &c;             // 正常工作printf("a points to: %d\n", *a);printf("b points to: %d\n", *b);return 0;
}

优化代码2:分开定义

#include <stdio.h>
#include <string.h>#define int_ptr int*int main() {int c = 100;int_ptr a;          // 单独声明每个指针int_ptr b;          // 单独声明每个指针a = &c;b = &c;printf("a points to: %d\n", *a);printf("b points to: %d\n", *b);return 0;
}


http://www.ppmy.cn/devtools/168573.html

相关文章

【数据分析】数据筛选(布尔索引:一个判断条件)

布尔索引 布尔索引&#xff1a;在实际应用中&#xff0c;只要是通过比较运算返回的判断结果&#xff08;一个布尔型Series&#xff09;&#xff0c;就可以进行布尔索引。 应用场景&#xff1a; 面对大型数据时&#xff0c;用于获取数据的行索引和列索引往往不确定&#xff0c…

代替Windows系统的最佳系统开发:开源、国产与跨平台的选择指南

近年来&#xff0c;随着技术自主化和隐私安全需求的提升&#xff0c;越来越多的用户开始寻求Windows系统的替代方案。本文结合国内外热门操作系统及开发工具&#xff0c;分析其核心优势与适用场景&#xff0c;助你找到最适合的开发与日常使用平台。 一、开源之王&#xff1a;Li…

C语言经典代码练习题

1.输入一个4位数&#xff1a;输出这个输的个位 十位 百位 千位 #include <stdio.h> int main(int argc, char const *argv[]) {int a;printf("输入一个&#xff14;位数&#xff1a;");scanf("%d",&a);printf("个位&#xff1a;%d\n"…

【华为OD题库-016】字符串摘要-Java

给定一个字符串的摘要算法&#xff0c;请输出给定字符串的摘要值 1、去除字符串中非字母的符号 2、如果出现连续字符(不区分大小写)&#xff0c;则输出:该字符(小)&#xff0b;连续出现的次数 3、如果是非连续的宁符(不区分大小写)&#xff0c;则输出:该字符(小写)该字母之后字…

如何解决Kafka Rebalance引起的重复消费

在Kafka中&#xff0c;Rebalance&#xff08;再平衡&#xff09;是消费者组&#xff08;Consumer Group&#xff09;动态调整分区分配的过程。当消费者组中的成员发生变化&#xff08;例如消费者加入或退出&#xff09;、订阅的Topic分区数量变化、或者消费者长时间未发送心跳时…

从头开始学C语言第二十八天——字符指针和字符串

C语言通过字符数组处理字符串。通常把char类型的指针变量称为字符指针&#xff0c;字符指针也被用来处理字符串。 初始化字符指针就是把字符串的首地址赋予指针&#xff0c;不是把字符串复制到字符指针。 char a[] "hello world"; char *pa a; *pa指向的不是字…

扩散模型算法实战——3D 形状生成

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​​ ​​​​​​ ​ ​ 1. 引言 3D 形状生成是计算机视觉和计算机图形学领域中的一个重要研究方向&#xff0c;旨在通过算法自动生成高质…

继承的知识点及小细节

目录 1>概念及定义 a.概念 b.定义 c.继承类模板 2>基类和派生类间的转换 3>作用域 a.隐藏规则 b.经典选择题 4>派生类的默认成员函数 a.4个常见默认成员函数 b.实现一个不能被继承的类 5>继承与友元 6>继承与静态成员 7>多继承以及菱形继承…