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

前言

        首先来看一个代码:

#include 
#include 

#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 
#include 

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 
#include 

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

你可能感兴趣的:(C++随记,c语言)