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";
포인터로 동작하는 이유:
당신이 말할 때char * str1
C 에서는, 메모리내의 포인터를 할당하고 있습니다.글을 쓸 때str1 = "Hello";
메모리내에 문자열 리터럴을 작성해, 포인터가 그것을 가리키게 합니다.다른 문자열 리터럴을 작성하는 경우"new string"
할당하다str1
포인터가 가리키는 위치를 변경하는 것 뿐입니다.
어레이에서 동작하지 않는 이유:
당신이 말할 때char str2 [] = "Hello"
문자열 리터럴을 생성하여 정의 중에 배열에 넣습니다.어레이가 계산하고 추가하기 때문에 크기를 지정하지 않아도 됩니다.'\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`
문자열 리터럴(예: "Hello")에는 유형이 있습니다.char[N]
어디에N
문자수(종료하는 문자 포함)입니다.'\0'
어레이는 첫 번째 요소에 대한 포인터로 변환할 수 있지만, 일부 나쁜 책이나 교사가 뭐라고 하든 어레이와 포인터는 동일하지 않습니다.
포인터가 있는 경우 다음과 같이 할당하면 효과가 있습니다.str1="Hello"
실제로 hello라는 이름의 스트링 리터럴을 생성하여 메모리 내 어딘가에 할당하고 리터럴의 첫 번째 문자 주소를 포인터에 할당합니다.포인터가 일정하지 않기 때문에 다른 주소로 다시 할당할 수 있습니다.또 하나 주의해야 할 점은 작성된 문자열 리터럴이 읽기 전용 메모리에 있다는 것입니다.
문자 배열의 경우 언어에서 지원되는 초기화 중에 문자열 리터럴을 할당할 수 있습니다.그리고 할당과 초기화를 혼동하지 마십시오.할당 중 문자 배열이므로 문자열 리터럴의 첫 번째 주소를 배열의 첫 번째 문자로 지정하려고 합니다(배열 이름은 배열의 첫 번째 요소의 주소를 반환합니다).첫 번째 요소는 포인터가 아니기 때문에 주소를 저장할 수 없기 때문에 이것은 분명 옳지 않습니다.
이는 단순히 이 코드를 작성할 때 다음과 같은 이유에서입니다.
char str2 [] = "hello";
또는 다음과 같은 경우도 있습니다.
int arr[] = {1,2,4,4,5};
만들어 내다str2
★★★★★★★★★★★★★★★★★」arr
고정 포인터로 사용합니다.그렇기 때문에 나중에 일반 포인터를 만들고 해당 포인터에 어떤 것도 할당할 수 있는 동안에는 이러한 포인터에 다른 값을 재할당할 수 없습니다.
간단히 말하면 어레이는 C/C++의 퍼스트 클래스 객체가 아니기 때문입니다.어레이에 할당하는 유일한 방법은 str(n)cpy 또는 memcpy를 사용하는 것입니다.
함수에 전달될 때 어레이가 포인터로 축소되는 동안 초기화 컴파일 시간을 제외하고 어레이에 할당할 수 없습니다.
언급URL : https://stackoverflow.com/questions/6803387/why-can-a-string-be-assigned-to-a-char-pointer-but-not-to-a-char-array
'source' 카테고리의 다른 글
하위에서 스토어 변경을 트리거해도 스토어가 업데이트되지 않습니다. (0) | 2022.08.19 |
---|---|
PDF 형식의 C89/C90 표준은 어디에서 찾을 수 있습니까? (0) | 2022.08.19 |
v-for 루프에서 서로 다른 onClick 함수를 호출합니다. (0) | 2022.08.19 |
페이지 헤더 구성 요소 - Vuex가 중첩된 하위 구성 요소의 저장소를 업데이트하도록 가져올 수 없습니다. (0) | 2022.08.19 |
Vuex는 시작 시 API 호출의 데이터를 채웁니다. (0) | 2022.08.19 |