IT이야기

char*와 const char*의 차이점

cyworld 2022. 6. 11. 11:49
반응형

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

반응형