Что такое "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.