programing

C 변수 선언의 괄호는 무엇을 의미합니까?

sourcejob 2023. 7. 23. 14:12
반응형

C 변수 선언의 괄호는 무엇을 의미합니까?

이게 무슨 뜻인지 누가 설명해 줄 수 있나요?

int (*data[2])[2];

괄호는 무엇을 의미합니까?

대괄호에서 []는 별표(*)보다 우선 순위가 높습니다.

위키피디아의 좋은 설명:

변수를 배열 포인터로 선언하려면 괄호를 사용해야 합니다.이는 C 괄호([])가 별표(*)보다 우선 순위가 높기 때문입니다.따라서 어레이에 대한 포인터를 선언하려면 괄호를 제공하여 이를 재정의해야 합니다.

double (*elephant)[20];

이것은 코끼리가 포인터이고 코끼리가 가리키는 유형은 20개의 이중 값 배열임을 선언합니다.

포인터 배열에 대한 포인터를 선언하려면 주석을 결합하기만 하면 됩니다.

int *(*crocodile)[15];

출처.

그리고 당신의 실제 사례는:

int (*data[2])[5];

데이터는 2개의 요소로 구성된 배열입니다.각 요소에는 5 int 배열에 대한 포인터가 포함되어 있습니다.

따라서 '데이터' 유형을 사용하여 코드를 입력할 수 있습니다.

int (*data[2])[5];
int x1[5];
data[0] = &x1;
data[1] = &x1;

data[2] = &x1;//<--- out of bounds, crash data has no 3rd element
int y1[10];
data[0] = &y1;//<--- compiling error, each element of data must point to an int[5] not an int[10]

"cdecl"이라는 매우 멋진 프로그램이 있는데, 이 프로그램은 Linux/Unix용으로 다운로드할 수 있으며 아마도 Windows용으로도 다운로드할 수 있을 것입니다.변수 선언 C(또는 c++decl을 사용하는 경우 C++)에 붙여넣으면 간단한 단어로 설명됩니다.

만약 당신이 C의 표현식을 읽는 방법을 안다면, 당신은 복잡한 선언문을 읽는 것에서 한 걸음 더 멀어질 것입니다.

무엇인가.

char *p;

정말 심술궂습니까?는 뜻입니다.*p문자입니다.무엇인가.

int (*data[2])[5];

심술궂어요? 그 말은(*data[x])[y]는 int입니다(단, 0 <= x < 2 및 0 <= y < 5 제공).이제, 그것의 의미가 무엇인지 생각해 보십시오.data꼭...2열...포인터...5개의 배열로...정수의

꽤 우아하다고 생각하지 않나요?당신이 하고 있는 것은 표현식의 종류를 말하는 것뿐입니다.일단 그걸 파악하면, 선언문은 다시는 당신을 위협하지 않을 것입니다!

"빠른 규칙"은 변수 이름으로 시작하여 를 누를 때까지 오른쪽으로 스캔하고, 변수 이름으로 돌아가서 괄호 쌍 중에서 (.)를 누를 때까지 왼쪽으로 스캔한 다음 이 과정을 반복하는 것입니다.

말도 안 되는 것에 적용해 봅시다.

void **(*(*weird)[6])(char, int);

weird는 각각 char와 int를 인수로 받아들이고 각각 포인터를 void로 반환하는 함수에 대한 6개의 포인터 배열에 대한 포인터입니다.

그게 뭔지, 어떻게 하는지 알았으니 이제...하지 마세요.typeefs를 사용하여 선언을 관리하기 쉬운 청크로 분할합니다.예.

typedef void **(*sillyFunction)(char, int);

sillyFunction (*weird)[6];

data [2] - 두 정수 배열

*data[2] - 두 정수 배열에 대한 포인터

(*data[2]) - "

(*data[2][2] - 2개의 정수 배열에 대한 2개의 포인터 배열.

배열이 있는 경우:

int myArray[5];
int * myArrayPtr = myArray;

아주 합리적일 겁니다.myArray▁▁pointer▁a에 대한 포인터입니다.int하는 것과 .myArray당신은 쓸 수 있어요...

myArrayPtr[1] = 3;

그것은 완벽하게 합리적입니다.괄호를 사용하는 것은 IMO를 읽고 이해하는 것을 어렵게 만듭니다. 그리고 그것들은 사람들이 포인터, 배열, 그리고 포인터 산술을 이해하지 못한다는 것을 보여줍니다. 이것이 컴파일러나 링커가 하나에서 다른 하나로 이동하는 방법입니다.하지만 괄호를 사용하면 경계 검사를 받을 수 있는 것 같습니다.

언급URL : https://stackoverflow.com/questions/244680/what-do-parentheses-in-a-c-variable-declaration-mean

반응형