Что такое "int * p = +s"; делать?

Я видел странный тип программы здесь.

int main()
{
    int s[]={3,6,9,12,18};
    int* p=+s;
}

Выше программы протестированы на компиляторах GCC и Clang и отлично работают на обоих компиляторах.

Мне интересно узнать, что делает int* p=+s; делать?

Разделен ли массив s на тип указателя?

Ответ 1

Встроенный operator+ может принимать тип указателя в качестве своего операнда, поэтому передача массива s в него приводит к преобразованию массива в указатель, а затем возвращается указатель int*. Это означает, что вы можете использовать +s индивидуально, чтобы получить указатель. (Для этого случая он лишний, без operator+ он также будет распадаться на указатель, а затем назначен на p.)

(акцент мой)

Встроенный оператор унарного плюса возвращает значение его операнда. Единственная ситуация, когда она не является no-op, заключается в том, что операнд имеет тип интегрального типа или неперечисленный тип перечисления, который изменяется путем цельной рекламы, например, он преобразует char в int или если операнд подчиняется lvalue-to-rvalue, преобразование массива в указатель или преобразование функции в указатель.

Ответ 2

Проверьте это:

#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

Ответ 3

Это символ унарного плюса, который здесь не имеет практического эффекта. Например:

#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 не совсем то же самое. Пожалуйста, обратитесь к ответам Хуршида Нормурадова и songyuanyao за подробностями.

Ответ 4

Разделен ли массив s на тип указателя?

Да.

Что делает int* p=+s; делать?

Оператор Unary + заставляет массив распадаться на указатель.

C++ Стандарт, 5.3.1 Унарные операторы (P7):

Операнд унарного + оператора должен иметь арифметическое, неперечисленное перечисление или тип указателя, а результат - значение аргумента. Интегральное продвижение выполняется на интегральных или перечисляющих операндах. Тип результата - тип продвинутого операнда.

Унарная + форма (+s) заставляет операнд быть оценена как число или указатель.

Для получения дополнительной информации см. Этот ответ.

Ответ 5

Здесь унарный + просто делает * 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.