为何char*赋值字符串的数组初始化方式适用于字符数组却不适用于int数组?
为什么
char *s="..."能正常运行,而int *a={...}不行? 这个问题的核心是指针和字符串字面量、普通数组初始化的本质差异,咱们一步步拆解清楚:
1. char *s="this is a character array" 为什么合法?
当你写字符串字面量"this is a character array"时,编译器会悄悄做这几件事:
- 在程序的只读数据段里,创建一个隐式的
const char数组,内容就是你写的字符串(末尾自动补'\0'结束符)。 - 把这个数组的首元素地址直接赋值给指针
s。
虽然严格来说,这里应该用const char *s来避免修改字符串字面量(修改会触发未定义行为),但C语言允许非const指针指向字符串字面量,所以这段代码能正常编译运行,printf("%s", s)也能通过首地址遍历整个字符串直到'\0'。
2. int *a={5641,5,98} 为什么无法生效?
这里的问题出在指针的初始化规则上:
int *a是个指针变量,它的本质就是个用来存内存地址的容器,根本不是用来存数组元素的。- 初始化指针时,你只能给它单个合法的地址值(比如另一个变量的地址、
NULL,或者单个整数(会被当作地址,非常危险))。 - 而你用
{5641,5,98}这种多元素的初始化列表,编译器完全摸不着头脑——怎么把三个整数塞到一个只存地址的指针里?所以直接就报错了。
正确实现类似需求的写法
如果你想让指针指向一个int数组,得先创建数组,再让指针指向它:
#include<stdio.h> int main() { int arr[] = {5641,5,98}; // 先创建真正的int数组 int *a = arr; // 让指针指向数组的首元素 // 比如用指针访问第一个元素:printf("%d", *a); 会输出5641 return 0; }
内容的提问来源于stack exchange,提问作者Kshyamano
相关产品推荐
相关产品推荐

