我在这里看到了一个奇怪类型的程序 here。
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
以上程序在 GCC 和 Clang 编译器上进行了测试,两个编译器都可以正常工作。
我很想知道 int* p=+s;
是做什么用的?
数组 s
是否被衰变成指针类型?
我在这里看到了一个奇怪类型的程序 here。
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
以上程序在 GCC 和 Clang 编译器上进行了测试,两个编译器都可以正常工作。
我很想知道 int* p=+s;
是做什么用的?
数组 s
是否被衰变成指针类型?
operator+
可以将指针类型作为其操作数,因此将数组s
传递给它会导致array-to-pointer conversion,然后返回指针int*
。这意味着您可以单独使用+s
来获取指针。(对于此情况,这是多余的;没有operator+
也会衰减为指针,然后赋值给p
。)内置的一元加运算符返回其操作数的值。唯一不是无操作的情况是当操作数具有整数类型或未作用域枚举类型,并通过整数提升进行更改,例如,它将char转换为int,或者如果操作数受到lvalue-to-rvalue,array-to-pointer或function-to-pointer转换的影响。
char
类型转换为 int
类型,就像在C++中一样,但是在C语言中,将一元加操作符放在数组、指针或函数前面是无效的。 - Donald Duckdouble arr[20],someFunc(void),x;
代码可以完全合法地执行x= +arr[5];
或x = +someFunc();
,因为数组和函数被取消引用了。 - supercat测试一下:
#include <stdio.h>
int main(){
char s[] = { 'h', 'e', 'l', 'l', 'o' , ' ', 'w', 'o', 'r', 'l', 'd', '!'} ;
printf("sizeof(s) : %zu, sizeof(+s) : %zu\n", sizeof(s), sizeof(+s) ) ;
}
在我的电脑上(Ubuntu x86-64),它会打印:
sizeof(s): 12, sizeof(+s) : 8
在哪里
12 = number of elements s times size of char, or size of whole array
8 = size of pointer
s
的赋值语句应该是char s[] = "Hello world";
,这样会更易读。 - David Foerster'\0'
字符。 - chtz那是一个单元加号符号,它在这里没有实际作用。例如:
#include <iostream>
int main() {
int a[] = {1};
std::cout << a << " " << +a << std::endl;
}
这将打印出相同的地址,无论是a
还是+a
。数组按照通常的方式衰减为指针。
请注意,如果使用一元减号-a
,GCC将显示错误:
error: wrong type argument to unary minus
编辑:尽管它对 OP 的代码没有影响,但 a
和 +a
并不完全相同。 有关详细信息,请参阅 Khurshid Normuradov 和 songyuanyao 的答案。
std::cout << a;
之所以只打印相同的内容,是因为operator<<
也会触发指针衰减,但a
是一个数组,而+a
是指向第一个元素的指针。 - 463035818_is_not_a_number数组
s
被降解为指针类型吗?
是的。
int* p=+s;
是什么意思?
一元运算符+
强制将数组降解为指针。
C++标准,5.3.1一元运算符(P7):
一元运算符
+
的操作数必须具有算术、未作用域枚举或指针类型,结果是参数值。对整数或枚举操作数进行整数提升。结果的类型是提升操作数的类型。
一元+
形式(+s)
强制将操作数评估为数字或指针。
更多信息,请参见此stack overflow answer。
这里的一元+仅仅是让*p指向Integer数组的地址。 我们来看两个数组s1和s2
int s1[]={1,5,2};
int s2[]={2,5,2};
int *p=+s1;
p=+s2;
printf("%d",(int)p[0]);
输出:2
在我看来,一元+只是将指针p指向数组s的起始地址。
sizeof
来计算一个数组和一个指针的大小。 - Yksisarvinenint b[2]; int a* = b;
,那么int *c = b+1
和int *d = a + 1
将包含不同的值。 - phuclv