当前位置: 首页 > 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;
}

http://www.dtcms.com/a/77152.html

相关文章:

  • 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)
  • 多机调度问题(C语言)
  • 《大语言模型》学习笔记(三)
  • LeetCode[42] 接雨水
  • Java设计模式建模语言面向对象设计原则
  • C#本地将labelme数据集转换为机器视觉yolo数据集格式
  • 数据库练习3
  • final 在 java 中有什么作用?
  • 用了Cline和华为云的大模型,再也回不去了
  • Skia 图形引擎介绍
  • 5.2《生活中的透镜》——5.3《凸透镜成像规律》讲后再上