2016-09-16 2 views
-2

*("Harry" + 2)"Harry"[3]은 동일한 출력 (r)을 가지고 있지만 "Harry" + 1 출력은 (arry) 인 이유를 고집합니다. 차이점은 무엇입니까? H 후 하나 개의 문자에문자열의 차이

cout << "Harry" + 1 << endl; 
cout << *("Harry" + 2) << endl; 
cout << "Harry"[3] << endl; 
cout << endl; 
+2

https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/로 이동하십시오. pointer.html : 포인터 연산에 대한 빠른 학습. –

+1

대신 "Hardy"를 사용해보십시오. 그러면 더 명확해질 수 있습니다. – evan

+0

문자열에'a', 'r','r'이 포함되어 있습니까? –

답변

3

"Harry" + 1 점은, 이제 문자열, H는 문자를 "손실".

*("Harry" + 2)H 이후 2자를 가리키고 있으므로 첫 번째 r을 가리 킵니다. 그것을 단 하나의 문자로 역 참조하면 r입니다.

"Harry"[3]은 두 번째 r"Harry"의 세 번째 문자를 가져옵니다. 구문 당은 *("Harry" + 3)입니다.

0

"Harry"는 const char* 문자열입니다. +1 작업은 "해리"의 시작 주소 다음에 오는 주소 인 a을 가져옵니다. 두 번째 문자부터 문자열로 인쇄하면 "arry"가됩니다. 마찬가지로 "Harry"+2는 첫 번째 r 문자의 주소를 가져 오므로 *을 사용하여 역 참조 할 때 r이됩니다. "Harry"[3]은 *("Harry"+3)과 동일하므로 두 번째 r 문자를 받아야합니다.이 문자는 여전히 r입니다.

요약하면 *을 사용하여 역 참조하는 경우 단일 문자를 인쇄하지만 역 참조하지 않는 경우 const char* 유형의 주소에서 시작하는 문자열을 인쇄합니다. 처음 두 행에서

+0

''해리''의 타입은'const char [6]'입니다. – molbdnilo

+0

아니요,'const char *'여야합니다. C/C++에서 다차원 배열의 가장 느린 인덱스는 고정 길이가 아닙니다. 그렇지 않아도됩니다. 당신은'int a = "Harry";'를 시도 할 수 있으며, 컴파일러는 "해시가 const char *'유형이라는"const char *에서 int 로의 잘못된 변환 "이라는 오류 메시지를 보냅니다. –

+0

아니요, 배열입니다. 다른 배열과 마찬가지로 첫 번째 요소에 대한 포인터로 변환 될 수 있지만 배열이면서 포인터는 아닙니다. 암묵적인 변환 때문에'const char *'에 관한 에러 메시지가 나온다. (그리고 "가장 느린"인덱스는 항상 다른 것들도 좋아하지만 컴파일러가 이니셜 라이저에서 유추하기 때문에 지정할 필요가 없습니다. int x [] [3];을 선언 할 수 없습니다.) – molbdnilo

0

그 정수는이 경우

cout << "Harry" + 1 << endl; 

오프셋, 우리가 1 바이트 오프셋 한 : 그것은 거 인쇄이 배열

cout << *("Harry" + 2) << endl; 

이 경우의이 배열 때문에, 우리는 두 가지가 바이트 오프셋 : rry 및 참조 해제가 r을 인쇄합니다.

cout << "Harry"[3] << endl; 

이 경우에는 색인 생성 Har ry 그래서 4 번째 요소 인 r을 인쇄 할 것입니다.

0

"Harry"로 만든 것으로 시작합시다.

당신이 만든 정의는 "const char [6]"입니다.

즉, 널 문자 ('/ 0')로 끝나는 5 자의 배열입니다.

이 기본 사항을 이해한다면 Rakete가 제공하는 설명이 더 이해하기 쉬워야합니다. 다시 말하면 배열과 포인터가 C++에서 작동하는 방식과 예제와 관련된 구문을 이해한다고 가정 해 봅시다.

기억해! 배열은 0부터 시작합니다. 그래서 var [3]을 지정할 때 네 번째 요소를 묻습니다. var [0]은이 경우 첫 번째 요소입니다.

cout에서 스트림 연산자를 사용하는 경우 일반적으로 var [0] 인 문자열의 시작점을 조작합니다.

0

C/C++에서 1 차원 배열은 첫 번째 요소에 대한 포인터로 감쇠 될 수 있습니다. 따라서 my_array + 2을 쓸 때, 주소는이고 배열의 세 번째 요소입니다. 따라서 *(my_array + 2)을 쓸 때 값이인데 이는 my_array[2]으로 작성하는 것과 같습니다.

따라서 "*(Harry + 2)""Harry[3]"의 출력은 같습니다 (참고 : 둘 다 서로 다른 요소에 대해 색인을 생성하므로 모두 'r'임).

"Harry + 1"을 쓸 때 두 번째 요소의 주소는 입니다. cout은 이것을 문자열의 시작으로 간주하고 끝까지 출력하므로 여러분은 그 결과를 꺼내게됩니다. "arry"

+0

*에 부식 될 수 있음 – Danh