前言
首先来看一个代码:
#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;
}