C 初始化与赋值不同?
我知道“hello”从字符串文本池返回字符串文本的地址,该字符串文本池不能直接分配给数组变量。在第一种情况下,“hello”文本中的字符将逐个复制到数组中,并在末尾添加“\0” 这是因为赋值运算符“=”在此重载以支持此操作吗C 初始化与赋值不同?,c,initialization,assignment-operator,C,Initialization,Assignment Operator,我知道“hello”从字符串文本池返回字符串文本的地址,该字符串文本池不能直接分配给数组变量。在第一种情况下,“hello”文本中的字符将逐个复制到数组中,并在末尾添加“\0” 这是因为赋值运算符“=”在此重载以支持此操作吗 我还想知道初始化与赋值不同的其他有趣情况。数组具有不可修改的地址。您需要一个指针作为可修改的左值 通过分配(尝试)一个contant字符串文字,您就是在获取它的地址。不同的地址导致了这种非法性 “hello”在内存中分配一些空间,并给出地址。然后获取它的地址来初始化数组。如
我还想知道初始化与赋值不同的其他有趣情况。数组具有不可修改的地址。您需要一个指针作为可修改的左值 通过分配(尝试)一个contant字符串文字,您就是在获取它的地址。不同的地址导致了这种非法性
“hello”在内存中分配一些空间,并给出地址。然后获取它的地址来初始化数组。如果您想将其视为重载的运算符(即使C不使用该术语),当然可以这样做 <>你也认为这是超载:
1.char str[] = "hello"; //legal
2.char str1[];
str1 = "hello"; // illegal
毕竟,它们分配的数据类型完全不同,但使用的是“同一个运算符”,对吗
它只是不同,初始化或分配
另一个很大的区别是,您过去可以初始化结构,但对于以后的赋值,没有相应的“struct literal”语法。从C99开始,情况就不再如此了。您不能将其视为重载(在C中无论如何都不存在),因为使用字符串文本初始化字符数组是一种特殊情况。字符串文字的类型是const char[N]
,因此,如果它类似于重载,则可以使用类型为const char[N]
的任何表达式初始化字符数组。但是你不能
unsigned char x;
double y;
x = 2;
y = 1.243;
语言标准简单地说,字符数组可以用字符串文本初始化。因为它们没有说明赋值,所以一般规则适用,尤其是数组不能赋值
对于初始化不同于赋值的其他情况:在C++中,有引用和类的情况下,会有无数例子。在C语言中,由于没有完整的类或引用,我唯一能想到的是常量变量:
const char arr[3];
const char arr1[] = arr; //compiler error. Cannot initialize array with another array.
另一个示例:使用大括号初始化数组
const int a = 4; //OK;
const int b; //Error;
b = 4; //Error;
结构也一样
int a[3] = {1,2,3}; //OK
int b[3];
b = {1,2,3}; //error
是数组初始化,使用C中定义的语法糖,因为字符串初始化非常常见。编译器在程序中分配一些固定内存,并对其进行初始化。数组名(str)的计算结果为该内存的地址,不能更改,因为没有保存该地址的变量
Grijesh Chauhan解释了这方面的更多细节
其他情况取决于你的意思。扩展当前情况,您可以很容易地看到其他初始化数组具有相同的属性,例如
char str[] = "hello";
在基本数据类型方面,你能给我一些初始化与赋值不同的例子吗?@nithishinpuititofhappiness
struct
是另一个这样的例子:struct x{int a;char c;}a={1,'1'}
有效,但以后不能执行a={2,'1'}代码>@GrijeshChauhan你读过我的答案了吗?在C99中(这并不是很新),您肯定可以做到:a=((struct x){2,'a'})现在再次阅读,可以像这样分配数组inta[]={1,2,3}
然后在我的代码a=(int[3]){3,2,1}实际上字符str1[]代码>也是非法的。@banarun是的,你是对的。我们需要声明数组的大小。非常感谢,但知道我删除了我的答案,因为我认为数组寻找其他初始化示例,这些示例在赋值中无效,答案基于标题
int a[] = { 1, 2, 3, 4 };