developer tip

문자열을 char * 포인터에 할당 할 수 있지만 char [] 배열에는 할당 할 수없는 이유는 무엇입니까?

optionbox 2020. 12. 1. 07:54
반응형

문자열을 char * 포인터에 할당 할 수 있지만 char [] 배열에는 할당 할 수없는 이유는 무엇입니까?


누군가 이것이 포인터로 작동하는 이유를 설명 할 수 있습니까?

char * str1;

str1 = "Hello1";

str1 = "new string";

// but not this
char str2 [] = "hello";
str2 = "four";

// or this
char str3 [];
str3 = "hello";
str3 = "hello";

포인터와 함께 작동하는 이유 : C로
말할 때 char * str1메모리에 포인터를 할당하는 것입니다. 를 작성할 때 str1 = "Hello";메모리에 문자열 리터럴을 만들고 포인터가이를 가리 키도록합니다. 다른 문자열 리터럴을 "new string"만들고에 할당 str1하면 포인터가 가리키는 위치를 변경하는 것뿐입니다.

배열에서 작동하지 않는 이유 :
라고 말하면 char str2 [] = "Hello"문자열 리터럴을 만들고 정의하는 동안 배열에 넣는 것입니다. 배열이 크기를 계산하고 여기에 a '\0'추가하므로 크기를 지정하지 않아도 됩니다. 크기를 조정하지 않고는 해당 어레이에 아무것도 재 할당 할 수 없습니다. 그것이 str2 = "four"작동하지 않는 이유 입니다.

의 경우도 str3마찬가지입니다. 정의에서 배열의 크기를 정의하지 않았으므로 크기를 0으로 계산했습니다. 배열의 크기를 조정하지 않고는 새로운 것을 할당 할 수 없습니다.


배열과 포인터는 다른 것입니다. 포인터에 할당 할 수 있지만 배열에는 할당 할 수 없습니다. 문자열 리터럴을 사용하는 char 배열의 초기화에는 특별한 예외가 있습니다.

char a[] = "Hello"; //initialize a char array with string literal. Special case, OK
char* p = "Hello"; //initializa a pointer with an array(which gets converted to pointer)
p = "My";   //assign pointer to point to another value. OK
a = "My";   //error, arrays cannot be assigned to. Use `strcpy`

(예 : "안녕하세요"와 같은) 문자열 리터럴 형식이 (종료를 포함하는 문자의 수입니다 ). 배열은 첫 번째 요소에 대한 포인터로 변환 될 수 있지만 일부 나쁜 책이나 교사가 말하든간에 배열과 포인터는 동일하지 않습니다.char[N]N'\0'


간단히 말해, 배열은 C / C ++에서 일류 객체가 아니기 때문입니다. 배열에 할당하는 유일한 방법은 str (n) cpy 또는 memcpy를 사용하는 것입니다.

배열이 함수에 전달 될 때 포인터로 축소되는 동안, 초기화로 컴파일 타임을 제외하고는 배열에 할당 할 수 없습니다.


이 코드를 작성할 때 다음과 같은 이유 때문입니다.

char str2 [] = "hello";

또는:

int arr[] = {1,2,4,4,5};

그것은 str2또는 arr상수 포인터로 생성 합니다. 그렇기 때문에 나중에 일반 포인터를 만들고 여기에 아무 것도 할당 할 수있는 동안 이러한 포인터에 다른 값을 다시 할당 할 수 없습니다.


포인터가있는 경우 다음과 같이 할당 할 때 str1="Hello"실제로 hello라는 문자열 리터럴을 만들고 메모리 어딘가에 할당하고 리터럴의 첫 번째 문자 주소를 포인터에 할당하고 포인터가 일정하지 않기 때문에 작동합니다. 다른 주소로 다시 할당 할 수 있습니다. 한 가지 더 중요한 점은 생성 된 문자열 리터럴이 읽기 전용 메모리에 있다는 것입니다.

문자 배열의 경우 언어에서 지원하는대로 초기화하는 동안 문자열 리터럴을 할당 할 수 있습니다. 할당과 초기화를 혼동하지 마십시오. 할당하는 동안 문자 배열이므로 문자별로 값을 변경해야합니다. 문자열 리터럴의 첫 번째 주소를 배열의 첫 번째 문자로 주소 지정하려고합니다 (배열의 이름은 첫 번째 요소의 주소를 반환합니다. 첫 번째 요소가 포인터가 아니기 때문에 이것은 분명히 옳지 않으며 주소를 저장할 수 없습니다.

참고 URL : https://stackoverflow.com/questions/6803387/why-can-a-string-be-assigned-to-a-char-pointer-but-not-to-a-char-array

반응형