*("Harry" + 2)
과 "Harry"[3]
은 동일한 출력 (r)을 가지고 있지만 "Harry" + 1
출력은 (arry
) 인 이유를 고집합니다. 차이점은 무엇입니까? H
후 하나 개의 문자에문자열의 차이
cout << "Harry" + 1 << endl;
cout << *("Harry" + 2) << endl;
cout << "Harry"[3] << endl;
cout << endl;
*("Harry" + 2)
과 "Harry"[3]
은 동일한 출력 (r)을 가지고 있지만 "Harry" + 1
출력은 (arry
) 인 이유를 고집합니다. 차이점은 무엇입니까? H
후 하나 개의 문자에문자열의 차이
cout << "Harry" + 1 << endl;
cout << *("Harry" + 2) << endl;
cout << "Harry"[3] << endl;
cout << endl;
"Harry" + 1
점은, 이제 문자열, H
는 문자를 "손실".
*("Harry" + 2)
은 H
이후 2자를 가리키고 있으므로 첫 번째 r
을 가리 킵니다. 그것을 단 하나의 문자로 역 참조하면 r
입니다.
"Harry"[3]
은 두 번째 r
인 "Harry"
의 세 번째 문자를 가져옵니다. 구문 당은 *("Harry" + 3)
입니다.
"Harry"는 const char*
문자열입니다. +1
작업은 "해리"의 시작 주소 다음에 오는 주소 인 a
을 가져옵니다. 두 번째 문자부터 문자열로 인쇄하면 "arry"가됩니다. 마찬가지로 "Harry"+2는 첫 번째 r
문자의 주소를 가져 오므로 *
을 사용하여 역 참조 할 때 r
이됩니다. "Harry"[3]은 *("Harry"+3)
과 동일하므로 두 번째 r
문자를 받아야합니다.이 문자는 여전히 r
입니다.
요약하면 *
을 사용하여 역 참조하는 경우 단일 문자를 인쇄하지만 역 참조하지 않는 경우 const char*
유형의 주소에서 시작하는 문자열을 인쇄합니다. 처음 두 행에서
''해리''의 타입은'const char [6]'입니다. – molbdnilo
아니요,'const char *'여야합니다. C/C++에서 다차원 배열의 가장 느린 인덱스는 고정 길이가 아닙니다. 그렇지 않아도됩니다. 당신은'int a = "Harry";'를 시도 할 수 있으며, 컴파일러는 "해시가 const char *'유형이라는"const char *에서 int 로의 잘못된 변환 "이라는 오류 메시지를 보냅니다. –
아니요, 배열입니다. 다른 배열과 마찬가지로 첫 번째 요소에 대한 포인터로 변환 될 수 있지만 배열이면서 포인터는 아닙니다. 암묵적인 변환 때문에'const char *'에 관한 에러 메시지가 나온다. (그리고 "가장 느린"인덱스는 항상 다른 것들도 좋아하지만 컴파일러가 이니셜 라이저에서 유추하기 때문에 지정할 필요가 없습니다. int x [] [3];을 선언 할 수 없습니다.) – molbdnilo
그 정수는이 경우
cout << "Harry" + 1 << endl;
오프셋, 우리가 1 바이트 오프셋 한 : 그것은 거 인쇄이 배열
cout << *("Harry" + 2) << endl;
이 경우의이 배열 때문에, 우리는 두 가지가 바이트 오프셋 : rry 및 참조 해제가 r을 인쇄합니다.
cout << "Harry"[3] << endl;
이 경우에는 색인 생성 Har ry 그래서 4 번째 요소 인 r을 인쇄 할 것입니다.
"Harry"로 만든 것으로 시작합시다.
당신이 만든 정의는 "const char [6]"입니다.
즉, 널 문자 ('/ 0')로 끝나는 5 자의 배열입니다.
이 기본 사항을 이해한다면 Rakete가 제공하는 설명이 더 이해하기 쉬워야합니다. 다시 말하면 배열과 포인터가 C++에서 작동하는 방식과 예제와 관련된 구문을 이해한다고 가정 해 봅시다.
기억해! 배열은 0부터 시작합니다. 그래서 var [3]을 지정할 때 네 번째 요소를 묻습니다. var [0]은이 경우 첫 번째 요소입니다.
cout에서 스트림 연산자를 사용하는 경우 일반적으로 var [0] 인 문자열의 시작점을 조작합니다.
C/C++에서 1 차원 배열은 첫 번째 요소에 대한 포인터로 감쇠 될 수 있습니다. 따라서 my_array + 2
을 쓸 때, 주소는이고 배열의 세 번째 요소입니다. 따라서 *(my_array + 2)
을 쓸 때 값이인데 이는 my_array[2]
으로 작성하는 것과 같습니다.
따라서 "*(Harry + 2)"
과 "Harry[3]"
의 출력은 같습니다 (참고 : 둘 다 서로 다른 요소에 대해 색인을 생성하므로 모두 'r'임).
"Harry + 1"
을 쓸 때 두 번째 요소의 주소는 입니다. cout은 이것을 문자열의 시작으로 간주하고 끝까지 출력하므로 여러분은 그 결과를 꺼내게됩니다. "arry"
*에 부식 될 수 있음 – Danh
https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/로 이동하십시오. pointer.html : 포인터 연산에 대한 빠른 학습. –
대신 "Hardy"를 사용해보십시오. 그러면 더 명확해질 수 있습니다. – evan
문자열에'a', 'r','r'이 포함되어 있습니까? –