const char * 를 사용하는 경우 및 const char [] 를 사용하는 경우
, 다르고, , , 다 요.char*
»char[]
하지만 이 모든 답변은 언제 사용해야 하는지 말해주지 않습니다.
제 질문은 다음과 같습니다.
언제 사용하십니까?
const char *text = "text";
언제 사용합니까?
const char text[] = "text";
어떤 지침이나 규칙이 있나요?
예를 들어, 어떤 것이 더 나은가?
void withPointer()
{
const char *sz = "hello";
std::cout << sz << std::endl;
}
void withArray()
{
const char sz[] = "hello";
std::cout << sz << std::endl;
}
있습니다.std::string
만, 으로 알고 .char
포인터를 합니다.
우선 둘 다 확연히 다릅니다.
- 첫 번째가 포인터를 만듭니다.
- 두 번째는 어레이를 만듭니다.
자세한 것은, 다음을 참조해 주세요.
어레이 버전:
char text[] = "text";
리터럴 "text를 유지하기에 . 에는 문자열 리터럴 "text"가 됩니다.NULL
어레이 ★★★★★★text
는 문자열 리터럴 "text"로 초기화됩니다.어레이는 나중에 수정할 수 있습니다.또한 어레이의 크기는 컴파일 시에도 알 수 있으므로 연산자를 사용하여 크기를 결정할 수 있습니다.
포인터 버전:
char *text = "text";
문자열 리터럴 "텍스트"를 가리키는 포인터를 만듭니다.이는 어레이 버전보다 빠르지만 포인터가 가리키는 문자열은 읽기 전용 구현 정의 메모리에 있으므로 변경하지 마십시오.이러한 문자열 리터럴을 변경하면 Undefined Behavior가 됩니다.
C은 "C++03"이 없는 하지 않습니다.const
키워드를 지정합니다. 선언문은 '그러다' 입니다.
const char*text = "text";
또한 이 함수를 사용해야 합니다.또한 이 함수의 크기를 찾을 필요가 없습니다.sizeof
연산자는 포인터 변수의 크기만 제공합니다.
어떤 버전이 더 나아요?
사용법에 따라 다릅니다.
- 문자열을 변경할 필요가 없는 경우 포인터 버전을 사용합니다.
- 데이터를 변경하려면 어레이 버전을 사용하십시오.
편집: OP가 다음 사이에서 차이를 찾고 있다는 것을 방금 알게 되었습니다.
const char text[]
★★★★★★★★★★★★★★★★★」const char* text
스트링 리터럴의 변경에 관한 점을 제외하고, 상기의 다른 점이 적용됩니다. ★const
의 test
、 of 、 is is 、 of of type of of of の of of of of of of of of of of의 요소를 .const char
이치노
포인터가 쉽게 다른 포인터에 재설치될 수 있고 다른 포인터를 통해 문자열을 수정할 수 있기 때문에 포인터 버전보다 어레이 버전을 선택합니다.
몇 년 전 Ulrich Drepper의 블로그 엔트리로부터 많은 도움을 받았습니다.
그 블로그의 요지는 이다.const char[]
또는static variable로만 .global static variable은 static입니다.
const char*
을 사용하다
- 추가 변수
- 포인터를 쓸 수 있습니다.
- 임시방편.
- 포인터를 통해 문자열에 액세스하려면 2개의 메모리 메모리가 필요합니다.
주의사항:
할 수 거야static const char sz[] = "hello";
그렇게 선언하면 읽기 전용 메모리에 쓰는 것으로 프로그램을 크래시 할 수 있는 장점이 있습니다.static
일관성을 버리고 내용을 변경하는 것은 눈치채지 못할 수 있습니다.
,,static
함수를 호출할 때마다 스택에 생성되고 상수 데이터 섹션에서 복사되는 대신 배열이 상수 데이터 섹션에 배치되도록 합니다.
가장 큰는 '할 수 '는 입니다.sizeof
연산자.서 - with 버 the the operator operator operator operator operator operator operator, with operator operator operator operator operator를 가리킵니다const char[]
할 수 sizeof
어레이의 메모리 풋프린트 크기(바이트)를 가져옵니다.포인터나 버퍼를 사용하여 무엇을 하고 싶은지, 어떻게 사용하고 싶은지에 따라 달라집니다.
예를 들어 다음과 같습니다.
void withPointer()
{
const char *sz = "hello";
std::cout << sizeof(sz) << std::endl;
}
void withArray()
{
const char sz[] = "hello";
std::cout << sizeof(sz) << std::endl;
}
아주 다른 답을 줄 거예요.
일반적으로 이러한 유형의 질문에 답하려면 가장 명확한 질문을 사용하십시오.
「」는,const char[]
버퍼 크기 등의 데이터에 대한 자세한 정보가 포함되어 있기 때문에 승리합니다.
배열을 사용하는 경우 데이터는 런타임에 초기화됩니다.포인터를 사용하면 포인터만 초기화하면 되기 때문에 런타임 오버헤드가 줄어듭니다.(데이터가 포인터 크기보다 작을 경우 데이터의 런타임 초기화는 포인터 초기화보다 작습니다.)따라서 중요한 데이터가 충분하고 초기화에 따른 런타임 비용이 걱정되는 경우 포인터를 사용해야 합니다.당신은 그 세부 사항들에 대해 거의 신경 쓰지 말아야 합니다.
이 표현에 대해 한 가지 사소한 점을 언급하면:
const char chararr[4] = {'t', 'e', 'x', 't'};
정확히 4글자로 어레이를 초기화하는 또 다른 방법입니다.
언급URL : https://stackoverflow.com/questions/7903551/when-to-use-const-char-and-when-to-use-const-char
'itsource' 카테고리의 다른 글
Vue.js 어레이에서 항목을 삭제하는 방법 (0) | 2022.08.27 |
---|---|
현재 인쇄된 콘솔 라인 지우기 (0) | 2022.08.27 |
양식 입력 변경 감지 방법 보기 (0) | 2022.08.27 |
버퍼 오버플로를 활성화하기 위해 gcc 컴파일러 최적화를 해제하는 방법 (0) | 2022.08.27 |
C 컴파일러를 C로 작성하려면 어떻게 해야 합니까? (0) | 2022.08.27 |