Development Tip

char와 char [1]의 차이점

yourdevel 2021. 1. 8. 22:30
반응형

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 인 해당 유형의 배열은 메모리에있는 내용이 거의 동일합니다.

제쳐두고, 당신이 charand 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

반응형