문자열을 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라는 문자열 리터럴을 만들고 메모리 어딘가에 할당하고 리터럴의 첫 번째 문자 주소를 포인터에 할당하고 포인터가 일정하지 않기 때문에 작동합니다. 다른 주소로 다시 할당 할 수 있습니다. 한 가지 더 중요한 점은 생성 된 문자열 리터럴이 읽기 전용 메모리에 있다는 것입니다.
문자 배열의 경우 언어에서 지원하는대로 초기화하는 동안 문자열 리터럴을 할당 할 수 있습니다. 할당과 초기화를 혼동하지 마십시오. 할당하는 동안 문자 배열이므로 문자별로 값을 변경해야합니다. 문자열 리터럴의 첫 번째 주소를 배열의 첫 번째 문자로 주소 지정하려고합니다 (배열의 이름은 첫 번째 요소의 주소를 반환합니다. 첫 번째 요소가 포인터가 아니기 때문에 이것은 분명히 옳지 않으며 주소를 저장할 수 없습니다.
'developer tip' 카테고리의 다른 글
MVC의 ActionLink에서 쿼리 문자열 매개 변수를 전달하는 방법 (0) | 2020.12.01 |
---|---|
Emacs에서 시맨틱 Jump to Symbol을 사용한 후 이전 줄 위치로 돌아가는 방법은 무엇입니까? (0) | 2020.12.01 |
스크립트를 강제로 다시로드하고 다시 실행하는 방법은 무엇입니까? (0) | 2020.12.01 |
기본 이메일 클라이언트를 자동으로 열고 콘텐츠를 미리 채 웁니다. (0) | 2020.12.01 |
숫자의 자릿수 합산-파이썬 (0) | 2020.12.01 |