char와 char [1]의 차이점
C ++에서 char와 char [1] 사용의 차이점 (있는 경우)은 무엇입니까?
예 :
struct SomeStruct
{
char x;
char y[1];
};
unsigned char에 대해서도 같은 이유가 있습니까?
주요 차이점은 하나의 문자에 액세스하는 데 사용하는 구문입니다.
"액세스"란 언어의 다양한 연산자를 사용하여 작업을 수행한다는 의미 입니다. 배열 char
과 비교하여 적용 할 때 대부분 또는 모두 다른 작업을 수행 char
합니다. 이것은 것처럼 들리게 x
하고 y
거의 완전히 다르다. 사실 둘 다 하나의 문자로 "구성"되지만 해당 문자는 매우 다른 방식으로 표현되었습니다.
구현으로 인해 다른 차이점 이 발생할 수 있습니다. 예를 들어 사용하는 구조에 따라 구조를 다르게 정렬하고 채울 수 있습니다. 하지만 그렇게 될지 의심 스럽습니다.
연산자 차이점의 예는 char가 할당 가능하고 배열이 그렇지 않다는 것입니다.
SomeStruct a;
a.x = 'a';
a.y[0] = 'a';
SomeStruct b;
b.x = a.x; // OK
b.y = a.y; // not OK
b.y[0] = a.y[0]; // OK
그러나 y
할당 할 수없는 사실이 할당 가능 해지는 것을 멈추지 않습니다 SomeStruct
.
b = a; // OK
이 모든 것은 유형에 관계없이 char
있습니다. 유형의 객체와 크기가 1 인 해당 유형의 배열은 메모리에있는 내용이 거의 동일합니다.
제쳐두고, 당신이 char
and char[1]
에서 "사용"하는 큰 차이를 만들어 내고 때때로 사람들이 배열이 실제로 포인터라고 생각하도록 혼동하는 데 도움 이되는 컨텍스트가 있습니다 . 귀하의 예가 아니라 함수 매개 변수로 :
void foo(char c); // a function which takes a char as a parameter
void bar(char c[1]); // a function which takes a char* as a parameter
void baz(char c[12]); // also a function which takes a char* as a parameter
숫자는의 선언에서 제공 bar
하고 baz
완전히 C ++ 언어에 의해 무시됩니다. 분명히 어떤 시점에서 누군가는 프로그래머에게 문서의 한 형태로 유용 할 것이라고 느꼈습니다. 이는 함수 baz
가 포인터 인수가 12 문자 배열의 첫 번째 요소를 가리킬 것으로 예상하고 있음을 나타냅니다 .
bar 및 baz에서는 c
배열 유형이 없습니다. 배열 유형처럼 보이지만 그렇지 않습니다. 단지 .NET과 동일한 의미를 가진 멋진 특수 구문입니다 char *c
. 그렇기 때문에 "사용"에 인용 부호를 붙 char[1]
였습니다. 실제로 전혀 사용하지 않고 있는 것처럼 보입니다.
실제로 char y[1]
프로덕션 코드에서 구조체의 마지막 멤버로 구성 을 본 적이 있다면 struct hack 의 인스턴스를 접했을 가능성이 큽니다 .
이 짧은 배열은 실제이지만 가변 길이 배열에 대한 스탠드 인입니다 (c99 이전에는 c 표준에 그런 것이 없었 음을 기억하십시오). 프로그래머는 항상 힙에 이러한 구조체를 할당하여 할당이 자신이 사용하려는 실제 배열 크기에 비해 충분히 큰지 확인합니다.
Steve가 강조한 표기법상의 차이점뿐만 아니라 char [1]은 예를 들어 template <int N> void f(char(&a)[N])
, char x = '\0'; f(&x);
일치하지 않는 곳에 전달 될 수 있습니다 . 배열 인수의 크기를 안정적으로 캡처하는 것은 매우 편리하고 안심할 수 있습니다.
또한 다른 것을 암시 할 수도 있습니다. 실제 길이가 더 길거나 (dmckee에서 설명하는대로) 내용이 논리적으로 ASCIIZ 문자열 (이 경우에는 비어 있음)이거나 문자 배열 (이 경우 하나의 요소를 갖도록). 구조가 여러 관련 구조 중 하나 인 경우 (예 : 배열 크기가 템플릿 인수 인 수학적 벡터 또는 일부 I / O 작업에 필요한 메모리 레이아웃 인코딩), 다른 필드와의 유사성이 전적으로 가능합니다. 어레이가 더 클 수있는 경우 단일 문자 어레이에 대한 선호도를 제시하여 지원 코드를 더 간단하고 보편적으로 적용 할 수 있습니다.
참조 URL : https://stackoverflow.com/questions/4120658/difference-between-char-and-char1
'Development Tip' 카테고리의 다른 글
자바 스크립트에서 뒤로 버튼 이벤트를 잡는 방법이 있습니까? (0) | 2021.01.08 |
---|---|
요소에서 창으로 스크롤 버블 링 방지 (0) | 2021.01.08 |
Thread.Sleep 대 Task.Delay? (0) | 2021.01.08 |
R의 가상 환경? (0) | 2021.01.08 |
React vs Angular : React를 사용한 느린 렌더링 (0) | 2021.01.08 |