Что значит "int * p = + s;"делать? - PullRequest
0 голосов
/ 30 мая 2018

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

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

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

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

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

Ответы [ 5 ]

0 голосов
/ 30 мая 2018

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

Да.

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

Унарный оператор + заставляет массив затухать до указателя.

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

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

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

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

0 голосов
/ 30 мая 2018

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

#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
0 голосов
/ 30 мая 2018

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

(выделение мое)

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

0 голосов
/ 30 мая 2018

Здесь унарный + просто заставляет * 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, чтобы указать начальный адрес массива.

0 голосов
/ 30 мая 2018

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

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

...