"int * p = + s;"는 무엇입니까? 하다?
나는 여기서 이상한 유형의 프로그램을 보았다 .
int main()
{
int s[]={3,6,9,12,18};
int* p=+s;
}
위의 프로그램은 GCC 및 Clang 컴파일러 에서 테스트 되었으며 두 컴파일러 모두에서 정상적으로 작동합니다.
궁금합니다. 무엇을 int* p=+s;
합니까?
배열 s
이 포인터 유형으로 붕괴됩니까?
내장 operator+
은 포인터 유형을 피연산자로 사용할 수 있으므로 배열 s
을 전달하면 배열 에서 포인터로 변환 된 다음 포인터 int*
가 반환됩니다. 즉 +s
, 포인터를 얻기 위해 개별적으로 사용할 수 있습니다 . (이 경우에는 불필요합니다. 그렇지 않으면 operator+
포인터로 감쇠 한 다음에 할당됩니다 p
.)
(강조 광산)
내장 단항 더하기 연산자는 피연산자의 값을 반환합니다. 이것이 no-op가 아닌 유일한 상황은 피연산자가 정수 유형 또는 범위가 지정되지 않은 열거 유형을 갖는 경우이며, 이는 정수 승격에 의해 변경됩니다. 예를 들어 char를 int로 변환하거나 피연산자가 lvalue-to-rvalue의 적용을받는 경우, 배열-포인터 또는 함수-포인터 변환.
이것을 테스트하십시오 :
#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) ) ;
}
내 PC (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
이것은 여기서 실질적인 효과가없는 단항 더하기 기호입니다. 예를 들면 :
#include <iostream>
int main() {
int a[] = {1};
std::cout << a << " " << +a << std::endl;
}
이것은 a
및 모두에 대해 동일한 주소를 인쇄합니다 +a
. 배열은 평소와 같이 포인터로 붕괴됩니다.
-a
대신 단항 마이너스 인 경우 GCC는 오류를 표시합니다.
error: wrong type argument to unary minus
편집 :이 영업 이익의 코드에 영향을주지 않습니다, 비록 a
와 +a
정확하게 동일하지 않습니다. 자세한 내용은 Khurshid Normuradov 및 songyuanyao의 답변을 참조하십시오.
배열
s
이 포인터 유형으로 붕괴됩니까?
예.
무엇을
int* p=+s;
합니까?
단항 +
연산자는 배열이 포인터로 감쇠되도록합니다.
C ++ 표준, 5.3.1 단항 연산자 (P7) :
단항 + 연산자의 피연산자는 산술, 범위가 지정되지 않은 열거 또는 포인터 유형을 가져야 하며 결과는 인수의 값입니다. 적분 승격은 적분 또는 열거 피연산자에서 수행됩니다. 결과 유형은 승격 된 피연산자의 유형입니다.
단항 +
형식 (+s)
은 피연산자가 숫자 또는 포인터로 평가되도록합니다.
자세한 내용은이 스택 오버플로 답변을 참조하십시오 .
여기서 단항 + 는 정수 배열의 주소를 가리 키도록 * p를 만듭니다. 두 개의 배열 s1과 s2를 봅시다
int s1[]={1,5,2};
int s2[]={2,5,2};
int *p=+s1;
p=+s2;
printf("%d",(int)p[0]);
출력 : 2
그래서 내 관점에서 단항 +는 포인터 p를 배열의 시작 주소를 가리 키도록 만드는 것입니다.
참고 URL : https://stackoverflow.com/questions/50598177/what-does-int-ps-do
'Program Tip' 카테고리의 다른 글
RAISERROR의 철자가 잘못된 이유는 무엇입니까? (0) | 2020.11.25 |
---|---|
Colspan이 Angular 2에서 알려진 기본 속성이 아닌 이유는 무엇입니까? (0) | 2020.11.24 |
새로운 기능이없는 C ++ 개체 (0) | 2020.11.24 |
기능을 삭제하지 않고 specflow (Gherkin)에서 기능을 비활성화하려면 어떻게합니까? (0) | 2020.11.24 |
브라우저에서 JavaScript가 처리 할 수있는 개체 크기의 한계에 도달 했습니까? (0) | 2020.11.24 |