이것은 간단한 질문 일 수 있지만 const char *는 왜 메모리 주소가 필요하지 않습니까?
예:
const char* a = "Anthony";
그리고 아닙니다 :
const char *a = // Address to const char
다른 유형과 마찬가지로?
이것은 간단한 질문 일 수 있지만 const char *는 왜 메모리 주소가 필요하지 않습니까?
예:
const char* a = "Anthony";
그리고 아닙니다 :
const char *a = // Address to const char
다른 유형과 마찬가지로?
답변:
이 선언을 상상할 수 있습니다
const char* a = "Anthony";
다음과 같은 방법
const char string_literal[] = "Anthony";
const char *a = string_literal;
즉, 컴파일러는 문자열을 저장하는 정적 저장 기간으로 문자 배열을 만들고 배열의 "Anthony"
첫 번째 문자 주소 (어레이 지정자가 첫 번째 문자에 대한 포인터를 암시 적으로 변환하기 때문에)가 포인터에 할당됩니다 a
.
다음은 문자열 리터럴이 문자 배열임을 보여주는 실증 프로그램입니다.
#include <iostream>
#include <type_traits>
decltype( auto ) f()
{
return ( "Anthony" );
}
template <size_t N>
void g( const char ( &s )[N] )
{
std::cout << s << '\n';
}
int main()
{
decltype( auto ) r = f();
std::cout << "The size of the referenced array is "
<< std::extent<std::remove_reference<decltype( r )>::type>::value
<< '\n';
g( r );
return 0;
}
프로그램 출력은
The size of the referenced array is 8
Anthony
문자열 리터럴 (문자열 리터럴을 저장하는 배열)의 크기는 문자열 8
에 종료하는 0 문자도 포함 하기 때문에 동일합니다 \0'
.
실증 프로그램에서 표현
std::extent<std::remove_reference<decltype( r )>::type>::value
식으로 만 대체 될 수있다
sizeof( r )
const char 에 메모리 주소가 필요하지 않은 이유는 무엇입니까? *
그렇습니다.
C 문자열 리터럴
"Anthony"
첫 번째 문자 의 주소로 소멸됩니다 . BTW처럼; C의 모든 배열은 않습니다.
const char[8]
(C ++에서는 C에있을 수 있음 char [8]
)이며 모든 내장 배열과 마찬가지로 값으로 사용할 때 첫 번째 요소에 대한 포인터로 부패합니다.
char [8]
C : c-faq.com/ansi/strlitnotconst.html
"
const char*
메모리 주소에 대한 포인터가 왜 필요 하지 않습니까?"
실제로, 그것을 가리 키기 위해 메모리 주소 가 필요합니다.
const char* a
means a
는 문자열 리터럴 또는 문자 상수에 대한 포인터입니다.
포인터 는 메모리의 특정 객체를 가리키는 포인터의 특성이기 때문에 항상 가리키는 주소가 필요합니다. 따라서 a
다른 포인터 const char
도 마찬가지입니다.
다음과 같은 "Hi My Name is Alfred!"
할당으로 문자열 리터럴 :
const char* a;
a = "Hi My Name is Alfred!";
문자열 리터럴의 첫 번째 요소 주소에 대한 포인터로 감소합니다.
차례로 의미 는 실행 환경에 따라 메모리의 어느 곳에 나 저장 될 수있는 a
문자열 리터럴의 첫 번째 요소의 주소에 의해 지정됩니다 "Hi My Name is Alfred!"
.
문자열 리터럴이 정확하게 저장된 프로그래머에게는 적합하지 않습니다. 귀하의 임무는 각 포인터를 적절하게 할당하고 처리하는 것입니다.