当前位置: 首页 > news >正文

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

前言

        首先来看一个代码:

#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;
}

相关文章:

  • 2025最新!人工智能领域大模型学习路径、大模型使用、AI工作流学习路径
  • 前端小食堂 | Day17 - 前端安全の金钟罩
  • 【深度学习量化交易16】触发机制设置——基于miniQMT的量化交易回测系统开发实记
  • 深度剖析Java开发中的双写一致性问题:原理、挑战与实战解决方案
  • 【如何在OpenWebUI中使用FLUX绘画:基于硅基流动免费API的完整指南】
  • Python教学:lambda表达式的应用-由DeepSeek产生
  • 网络请求requests模块(爬虫)-15
  • bbbbb
  • html-to-image的使用及图片变形和无图问题修复
  • python如何查看版本号
  • 冯 • 诺依曼体系结构
  • JS做贪吃蛇小游戏(源码)
  • Ubuntu 安装Mujoco3.3.0
  • 防止用户调试网页的若干方法
  • 思维训练让你更高、更强 |【逻辑思维能力】「刷题训练笔记」假设法模式逻辑训练题(6-16)
  • 简单以太网配置
  • 【算法】分治-快排 算法专题
  • 第十三天-搜索算法:开启探索之门
  • 【css酷炫效果】纯CSS实现瀑布流加载动画
  • Swift 并发中的任务让步(Yielding)和防抖(Debouncing)
  • 美国贸易政策|特朗普模式:你想做交易吗?
  • 从近200件文物文献里,回望光华大学建校百年
  • 圆桌丨新能源车超充技术元年,专家呼吁重视电网承载能力可能面临的结构性挑战
  • “大型翻车现场”科技满满,黄骅打造现代化港口和沿海新城典范
  • 选址江南制造总局旧址,上海工业博物馆建设有新进展
  • 曾犯强奸罪教师出狱后办教培机构?柳州鱼峰区教育局回应