在下面的代码中:
char data[128] = "Just A Test \0";
char *cTest2 = data;
char *cTest3 = &data[0];
cTest2和cTest3有什么区别? 你何时会使用一种初始化方法而不是另一种方法?
答案 0 :(得分:3)
没有区别;因为一个体面的编译器会产生相同的代码,你根据个人喜好使用它。
答案 1 :(得分:2)
实际上没有区别,但您的代码应该反映您的意思。
如果要整体处理数组,请使用cTest2
的样式
如果要处理第一个元素,请使用cTest3
。
答案 2 :(得分:2)
完全没有区别。 C ++规范说:
后缀表达式后跟方括号中的表达式是后缀表达式。其中一个表达方式 应具有“T的数组”或“指向T的指针”的类型,另一个应具有无范围的枚举 或整体式。结果是“T”类型。“T”类型应是完全定义的对象类型。该 表达式E1 [E2]与*((E1)+(E2))相同(按照定义)
这意味着data[0]
按照定义与*data
相同,因此始终按照定义,&(data[0])
是 data
。
答案 3 :(得分:1)
首先,在字符串文字
中包含零字符没有多大意义char data[128] = "Just A Test \0";
^^^
字符串文字已包含终止零。
至于指针声明,那么这两个
之间没有区别char *cTest2 = data;
char *cTest3 = &data[0];
表达式中使用的字符数组被隐式转换为指向其第一个元素的指针。所以这两个声明是等价的。
但是我更喜欢第一个声明,因为它更清楚。我只会在指针必须由除第一个元素之外的数组元素的地址初始化时使用第二个声明。例如
char *cTest3 = &data[5];
但在这种情况下,取消引用表达式data + 5
是没有意义的,因为data[5]
等同于*( data + 5 )
而&data[5]
等同于&*( data + 5 )
。虽然当两个运营商和并且*相互跟随,编译器可以省略指针的解除引用。
根据C标准(6.5.3.2地址和间接运营商)
- ...如果操作数是一元*运算符的结果,则不是 操作员和&运算符被评估,结果就像两者一样 被省略,除了对运算符的约束仍然适用 结果不是左值......
醇>
所以实际上我会写
char *cTest3 = data + 5;
答案 4 :(得分:0)
如果你有某个地方
char *cTest4 = &data[5];
或类似的方案我会投票给cTest3。否则cTest2看起来更干净。