Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 初始化与赋值不同?_C_Initialization_Assignment Operator - Fatal编程技术网

C 初始化与赋值不同?

C 初始化与赋值不同?,c,initialization,assignment-operator,C,Initialization,Assignment Operator,我知道“hello”从字符串文本池返回字符串文本的地址,该字符串文本池不能直接分配给数组变量。在第一种情况下,“hello”文本中的字符将逐个复制到数组中,并在末尾添加“\0” 这是因为赋值运算符“=”在此重载以支持此操作吗 我还想知道初始化与赋值不同的其他有趣情况。数组具有不可修改的地址。您需要一个指针作为可修改的左值 通过分配(尝试)一个contant字符串文字,您就是在获取它的地址。不同的地址导致了这种非法性 “hello”在内存中分配一些空间,并给出地址。然后获取它的地址来初始化数组。如

我知道“hello”从字符串文本池返回字符串文本的地址,该字符串文本池不能直接分配给数组变量。在第一种情况下,“hello”文本中的字符将逐个复制到数组中,并在末尾添加“\0”

这是因为赋值运算符“=”在此重载以支持此操作吗


我还想知道初始化与赋值不同的其他有趣情况。

数组具有不可修改的地址。您需要一个指针作为可修改的左值

通过分配(尝试)一个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 };