C语言:无需额外变量初始化指向数组字面量的指针
解决无需额外数组即可创建指向数组的指针的问题
嘿,我完全懂你的困扰——要处理10个这类指向数组的指针,还要挨个先定义数组再赋值,确实挺麻烦的。先给你掰扯清楚之前写法的问题,再给你几个简洁的解决方案:
为什么你的初始写法不对?
你尝试的int *numList = {1, 2, 3};其实是错误的:
int*是单个指向整数的指针,不能用多元素的初始化列表(除非你只给一个值,把它转成指针,但这通常是未定义行为,因为1、2这些不是合法的内存地址)。- 你想要的是指向数组的指针,而不是“指向整数的指针数组”,这俩类型完全不一样:
- 指向数组的指针:
int (*ptr)[N](这里N是数组大小) - 指针数组:
int *ptr[N]
- 指向数组的指针:
最简洁的方案:用C99复合字面量
C99引入的复合字面量可以帮你创建匿名数组,直接取它的地址赋值给指向数组的指针,完全不用额外定义数组变量。
比如你要一个指向包含3个int的数组的指针,写法是:
// 定义指向int[3]类型数组的指针,直接绑定到匿名数组 int (*numList)[3] = &(int[3]){1, 2, 3};
访问数组元素的方式有两种,效果完全一样:
// 方式1:解引用指针后访问数组下标 printf("%d\n", (*numList)[0]); // 输出1 // 方式2:利用指针的数组式访问(编译器会自动处理) printf("%d\n", numList[0][1]); // 输出2
一次性处理10个这样的指针
如果要创建10个指向数组的指针,可以把它们放进一个数组里,同样用复合字面量批量初始化:
// 定义一个数组,每个元素都是指向int[3]的指针 int (*ptrArray[10])[3] = { &(int[3]){1, 2, 3}, &(int[3]){4, 5, 6}, &(int[3]){7, 8, 9}, // ... 继续补充剩下的7个匿名数组即可 };
注意复合字面量的生命周期
- 如果是在函数内部定义的复合字面量,它的生命周期和普通自动变量一样,出了函数就会被销毁,对应的指针会变成悬空指针,千万别再用了。
- 如果需要持久化的数组(比如全局使用),可以给复合字面量加上
static关键字,让它的生命周期贯穿整个程序运行期间:int (*numList)[3] = &(static int[3]){1, 2, 3};
这样就完美解决了你不想额外创建数组的需求,不用再挨个定义数组变量啦!
内容的提问来源于stack exchange,提问作者Matthias
相关产品推荐
相关产品推荐

