char*와 const char*의 차이점
와의 차이는 무엇입니까?
char* name
일정한 문자열 리터럴을 가리키고 있습니다.
const char* name
char*
는 가변 문자/문자열에 대한 가변 포인터입니다.
const char*
는 불변의 문자/스트링에 대한 가변 포인터입니다.이 포인터가 가리키는 위치의 내용은 변경할 수 없습니다.또한 컴파일러는 사용자가 오류 메시지를 표시하려고 할 때 에러 메시지를 표시해야 합니다.같은 이유로, 로의 변환됩니다.const char *
로로 합니다.char*
을 사용하다
char* const
는 불변의 포인터입니다(다른 장소를 가리킬 수 없습니다).단, 포인터가 가리키는 장소의 내용은 변경할 수 있습니다.
const char* const
는 불변의 문자/스트링에 대한 불변의 포인터입니다.
char *name
를 바꿀 수 요.name
포인트 및 포인트 문자.
const char* name
문자를 변경할 수 있습니다. name
포인트는 변경할 수 없습니다.
수정:포인터는 변경할 수 있지만 다음 문자를 변경할 수 없습니다.name
(https://msdn.microsoft.com/en-us/library/vstudio/whkd4k6a(v=vs.100).aspx, "예" 참조)를 가리킵니다.이 경우,const
지정자 지정자는에 적용됩니다에 적용된다.char
일이 아니라 별표.,아스타리스크가 아닙니다.
MSDN 페이지 및 http://en.cppreference.com/w/cpp/language/declarations,에 따르면const
그 이 되기 전에기 전에*
그decl-specifier 시퀀스의 일부, 반면 decl-specificer 시퀀스의 일부이지만,.const
끝나곤 후*
는 선언자의 부분이다.A선언자의 일부입니다.
선언자 순서 다중 declarators에 의해, 왜선언 지정자 시퀀스는 여러 선언자 뒤에 이어질 수 있습니다는 이어질 수 있다.따라서const char * c1, c2
선언하다를 선언하c1
~하듯이로const char *
그리고 그리고.c2
~하듯이로const char
.
편집:
코멘트를 보면 포인터가 문자열 리터럴을 가리킬 때 두 선언의 차이에 대해 질문하는 것 같습니다.
이 경우 다음 문자를 수정하지 마십시오.name
정의되지 않은 동작이 발생할 수 있기 때문에 포인트.문자열 리터럴은 읽기 전용 메모리 영역(실장 정의)에 할당할 수 있습니다.또, 유저 프로그램에 의해서 변경은 행해지지 않습니다.이렇게 하면 정의되지 않은 동작이 발생합니다.
따라서 이 경우(문자열 리터럴에서의 사용법)의 유일한 차이점은 두 번째 선언이 약간의 이점을 제공한다는 것입니다.보통 두 번째 경우 문자열 리터럴을 수정하려고 하면 컴파일러에 의해 경고가 표시됩니다.
#include <string.h>
int main()
{
char *str1 = "string Literal";
const char *str2 = "string Literal";
char source[] = "Sample string";
strcpy(str1,source); //No warning or error, just Undefined Behavior
strcpy(str2,source); //Compiler issues a warning
return 0;
}
출력:
cc1: 경고는 오류로 처리됩니다.
prog.c: 함수 'main'에서:
prog.c:9: 오류: 'strcpy'의 인수 1을 전달하면 포인터 대상 유형에서 한정자가 삭제됩니다.
컴파일러는 두 번째 케이스에 대해 경고하지만 첫 번째 케이스에 대해서는 경고하지 않습니다.
char mystring[101] = "My sample string";
const char * constcharp = mystring; // (1)
char const * charconstp = mystring; // (2) the same as (1)
char * const charpconst = mystring; // (3)
constcharp++; // ok
charconstp++; // ok
charpconst++; // compile error
constcharp[3] = '\0'; // compile error
charconstp[3] = '\0'; // compile error
charpconst[3] = '\0'; // ok
// String literals
char * lcharp = "My string literal";
const char * lconstcharp = "My string literal";
lcharp[0] = 'X'; // Segmentation fault (crash) during run-time
lconstcharp[0] = 'X'; // compile error
// *not* a string literal
const char astr[101] = "My mutable string";
astr[0] = 'X'; // compile error
((char*)astr)[0] = 'X'; // ok
어떤 경우에도 문자열 리터럴로의 포인터가 다음과 같이 선언되었는지에 관계없이 문자열 리터럴을 변경할 수 없습니다.char *
또는const char *
.
단, 포인터가 다음과 같은 경우const char *
포인터 값을 수정하려고 하면 컴파일러가 진단을 제공해야 합니다.char *
그럼 안 되겠네요.
케이스 1:
char *str = "Hello";
str[0] = 'M' //Warning may be issued by compiler, and will cause segmentation fault upon running the programme
위의 str은 프로그램의 바이너리 이미지로 하드 코드 되어 있는 리터럴 값 "Hello"를 가리키도록 설정되어 있습니다.이것은, 이 String 리터럴의 변경이 부정하고, 세그먼트화의 장해가 발생하는 것을 의미합니다.
케이스 2:
const char *str = "Hello";
str[0] = 'M' //Compile time error
케이스 3:
char str[] = "Hello";
str[0] = 'M'; // legal and change the str = "Mello".
문제는 두 사람 사이에 어떤 차이가 있느냐는 것이다.
char *name
일정한 문자열 리터럴을 가리키고 있습니다.
const char *cname
즉,
char *name = "foo";
그리고.
const char *cname = "foo";
둘 사이에는 큰 차이가 없으며 둘 다 맞다고 볼 수 있습니다.C 코드의 오랜 유산 때문에 문자열 리터럴에는 다음과 같은 종류가 있습니다.char[]
아니라, 이에요.const char[]
로, 「이렇게 하면 안 」라고 오래된 코드도 .char *
const char *
인수를 변경하지 않은 경우에도 마찬가지입니다.
으로 두 은 '다르다'라는 것입니다.*cname
★★★★★★★★★★★★★★★★★」cname[n]
으로 평가합니다.const char
에 , ,는.*name
★★★★★★★★★★★★★★★★★」name[n]
으로 평가합니다.char
변경 가능한 lvalue입니다.할당 대상이 수정 가능한 l값이 아닌 경우 적합한 컴파일러는 진단 메시지를 생성해야 합니다. 유형의 l값에 할당 시 경고를 생성할 필요가 없습니다.char
:
name[0] = 'x'; // no diagnostics *needed*
cname[0] = 'x'; // a conforming compiler *must* produce a diagnostic message
컴파일러는 어느 경우든 컴파일을 중지할 필요가 없습니다.컴파일러는 할당에 대한 경고를 생성하기에 충분합니다.cname[0]
결과 프로그램은 올바른 프로그램이 아닙니다.구조의 동작이 정의되지 않았습니다.크래시되거나 크래시되지 않고 메모리 내의 문자열 리터럴이 변경될 수 있습니다.
첫 번째는 실제로 바꿀 수 있고, 두 번째는 바꿀 수 없습니다.에 대해 읽어보십시오.const
정확성(차이에 대한 좋은 가이드가 몇 가지 있습니다., there있있 there 도 있다.char const * name
다시 임명할 수 없는 곳이죠
로로 actually actually actually actually.char* name
는 상수에 대한 포인터가 아니라 변수에 대한 포인터입니다.을 사용하다
char * const와 const char *의 차이점은 무엇입니까?
언급URL : https://stackoverflow.com/questions/9834067/difference-between-char-and-const-char
'IT이야기' 카테고리의 다른 글
printf를 통해 보완이 다르게 동작하는 이유는 무엇입니까? (0) | 2022.06.11 |
---|---|
다른 메서드에서 정의된 내부 클래스 내의 비최종 변수를 참조할 수 없습니다. (0) | 2022.06.11 |
스타일링 Vue 슬롯 (0) | 2022.06.11 |
log4j: 특정 클래스의 출력을 특정 Appender에 기록합니다. (0) | 2022.06.11 |
[Nuxt, i18n, Vuex] :접속 방법스토어게터로부터의 $i18n.locales (0) | 2022.06.11 |