"어레이/포인터 동등성"을 뜻하는 현대 용어는 무엇입니까?
이것을 읽는 모든 사람들은 아마도 C에 대한 세 가지 핵심 사실에 익숙할 것입니다.
- 식에서 배열 이름을 언급하면 배열의 첫 번째 요소에 대한 포인터가 평가됩니다(대부분).
- 배열 구독 연산자
[]
포인터에 대해서도 배열에 대해서만큼 잘 작동합니다. - 배열로 보이는 함수 매개 변수는 실제로 포인터를 선언합니다.
이 세 가지 사실은 C에서 배열 및 포인터 처리에 절대적으로 핵심적입니다.그것들은 세 개의 별개의 사실이 아닙니다. 그것들은 하나의 중심 개념의 서로 연결된 측면입니다.이 개념에 대한 적절한 이해 없이는 상당히 기본적인 C 프로그래밍조차 제대로 수행할 수 없습니다.
오늘 제 질문은 간단하게, 이 컨셉의 이름이 무엇인가요?
저는 제가 구식이라고 생각했지만, 저는 항상 그것을 "C의 배열과 포인터 사이의 동등성" 또는 줄여서 "배열/포인터 동등성"이라고 불렀습니다.하지만 저는 여러분이 SO에 대해 그런 단어들을 거의 말할 수 없다는 것을 배웠습니다. 그것들은 거의 금기사항입니다.
이것은 추상적이거나 철학적인 질문처럼 보일 수 있으므로, 좀 더 구체적으로 말하자면, 제가 찾고 있는 것은 "네, ___로 인해, 배열 구독은 포인터 산술을 위한 통사적 설탕으로 생각할 수 있습니다"라는 문장에서 사용할 수 있는 간단한 명사 또는 명사 구문입니다.
(그러나 저는 그 질문에 대한 답을 찾고 있는 것이 아니며 "'평등'이라는 단어가 무엇이 문제입니까?"라는 질문에 대한 답을 찾고 있는 것이 아닙니다.네, 저도 압니다. 이것은 학습자들이 배열과 포인터가 어떻게든 같다고 착각하도록 유도할 수 있습니다.제가 이 FAQ 목록 항목을 작성할 때 그런 혼란을 염두에 두고 있었습니다.)
- "array subscribing" 연산자 []는 배열에서와 마찬가지로 포인터에 대해서도 작동합니다.
아니요, 사실 포인터에만 사용할 수 있습니다.입력할 때마다[]
식을 사용하면 항상 첫 번째 요소에 대한 포인터를 얻을 수 있습니다.이것은 다음 이후로 발생할 것이 확실합니다.arr[i]
다음과 같아야 합니다.*(arr + i)
전자는 후자를 위한 "통사 설탕"입니다.
- 배열로 보이는 함수 매개 변수는 실제로 포인터를 선언합니다.
이것은 실제로 "어레이 조정"이라고 불리는 특별한 경우로, 컴파일러가 암시적으로 배열 유형의 함수 매개 변수 선언을 첫 번째 요소에 대한 포인터로 변경합니다.이론적 근거는 분명히 표현식의 "배열 붕괴"와 호환되는 함수를 만드는 것이지만, C 표준은 항을 별도로 유지합니다.
식과 함수 매개변수 모두 비공식적으로 "어레이 붕괴"라고 합니다.때때로 이것은 표현식에만 사용되고 함수 매개 변수에는 사용되지 않습니다.저는 그 용어의 일관된 사용법이 하나도 없다고 생각합니다.C 표준은 어디에서도 이 용어를 사용하지 않지만 "Array decay"가 가장 좋다고 생각합니다.
배열이 포인터로 바뀔 수는 있지만 반대로 바뀔 수는 없기 때문에 "동등성"이라는 용어는 싫어합니다.실제로 "배열과 포인터는 같은 것이다"와 같은 혼란스러운 믿음을 가진 수많은 초보자들이 항상 생각납니다.그들을 "동등한"이라고 부르는 것은 정확히 도움이 되지 않습니다.)
C 표준에는 이에 대한 단어가 하나도 없습니다.6.3.2.1p3에서 동작(1)을 정의할 때 "변환", 6.5.2.1p2에서 동작(2)을 정의할 때 "동등", 6.7.6.3p7에서 동작(3)을 정의할 때 "조정"이라는 단어를 사용합니다.
저는 구식이며, (1)이 발생하는 표현식이나 (3)이 발생하는 함수 선언에 대해 이야기하는 것이 문맥상 명확하다면 이를 "어레이/포인터 동등성"이라고 부르는 것이 잘못된 것이라고 생각하지 않습니다.하지만, "동등성"을 좋아하지 않는 사람들에게 더 마음에 드는 용어는 아마도 "어레이 투 포인터 변환"일 것입니다. 왜냐하면 이것은 (1)일 때 사람들을 가장 혼란스럽게 하기 때문입니다.
저는 배열 붕괴라는 용어에 찬성합니다.이 용어는 그것이 제안하는 것과 잘 맞습니다.C 표준은 이러한 맥락에서 그것에 대해 말하지 않으며 네, 제가 표준에서 검색하기 위해 갔던 용어를 처음 들었던 날 저는 그것을 찾을 수 없었습니다(그래서 누가 그 용어를 만들었는지 등에 대해 약간 혼란스럽습니다).또는 "대부분의 시나리오 배열이 포인터로 변환됨"으로 인해 작성할 수 있습니다. - 아니요, 단일 명사가 아닙니다.하지만 이것은 잘못된 해석이 일어나는 것을 용납하지 않습니다.표준 자체가 "전환"이라고 말합니다.
대부분의 경우 저는 길게 말하고 괄호 안에 ("array decaying")이라는 단어를 넣으려고 합니다.사실 제가 언급하지도 않고 그냥 표준의 포인터로 변환하는 말을 가지고 간 답변들이 있습니다.
저는 "어레이 투 포인터 붕괴"가 합리적인 속기라고 제안합니다. "decay"는 형식 변환을 언급할 때 일반적인 전문 용어이기 때문입니다. C FAQ: 질문 6.12의 다른 부분에서 선례가 있습니다.
Q: 배열 참조가 포인터로 감쇠하기 때문에 arr이 배열이라면 arr과 &arr의 차이점은 무엇입니까?
C++ 표준 라이브러리 명명법은 C++11 이후로 C++ 표준 라이브러리 명명법으로 채택되었습니다.
언급된 세 가지 개념에 대한 단일 이름은 없지만, 적어도 "현대" C를 설명할 때, 그것들을 어떤 종류의 "동등성"을 암시하는 것으로 묘사하는 것은 역효과를 낸다고 생각합니다.배열 붕괴의 결과는 일반적으로 포인터처럼 동작하지만, C99는 배열 붕괴에 의해 산출된 포인터가 다른 수단을 통해 달성된 포인터와 동일한 방식으로 동작할 필요가 없다고 명시합니다.주어진:
char fetch_byte_at(void *p, int x) { return ((char*)p)[x]; }
struct {char arr[5][7];} s;
char test1(int x) { return s.arr[0][x]; }
char test2(int x) { return fetch_byte_at(&s, x); }
이 표준은 포인터 값을 사용하는 이유를 직접적으로 명시하지 않습니다.s.arr[0]
에서 사용되는.test1
포인터 값과 동일하지 않아야 합니다.((char*)(void*)s)
사용되는 경우fetch_byte_at
에서 호출됨test2
하지만 동시에 다음과 같은 의미를 내포하고 있습니다.test2
의 모든 바이트를 읽을 수 있어야 합니다.s
[그것이 예측 가능하게 작동해야 한다는 것을 증명합니다.x
라고 말하면서도 적어도 34]까지는s.arr[0][x]
의 값에 대해서만 의미가 있습니다.x
6까지
이 기준서의 어떤 것도 처음 두 점 중 하나를 개별적으로 반박하지는 않겠지만, 두 점 모두를 유지하는 것은 불가능합니다.배열 붕괴의 결과는 배열의 첫 번째 요소에 대한 "일반적인" 포인터가 아닌 다른 것이거나, 또는 다음을 적용하는 것입니다.[]
연산자를 배열에 적용하는 것은 포인터에 적용하는 것과 의미가 다릅니다.#1과 #2 중 어느 것이 C99에 의해 무효화되었는지는 불분명하지만, 그들은 현대 C에서 더 이상 함께 어떤 종류의 "동등성"을 형성하지 않습니다.
만약 당신이 전통적인 C와 "현대적인" C 사이의 차이를 인식한다면, 전자를 유용하게 만드는 것들에 대한 용어를 설정하는 것이 유용할 수 있습니다.그러나 그러한 것들은 당신이 언급한 요점을 넘어선다.안타깝게도, 저는 그러한 것들에 대한 어떤 표준 용어도 알지 못하며, 관련된 개념들을 더 이상 지원하지 않을 때 그러한 용어를 제공하기 위해 표준을 찾지 않을 것입니다.
감사합니다, 여러분.저는 사람들이 제시한 답변과 그에 대한 제 평가를 요약하기 위해 이 "답변"을 사용하는 것이지, 누군가가 찬성표를 던질 것이라고 기대하는 적절한 대답이 아닙니다.
많은 사람들이 이 문제에 대해 진지하게 생각했고, 저는 그것에 감사합니다.하지만 이 시점에서 제가 결론을 내릴 수 있는 유일한 것은 적어도 오늘 제가 염두에 두고 있던 질문에 대한 답이 없다는 것입니다.
꽤 많은 사람들이 "어레이 붕괴"를 제안했고, 그것은 매우 좋은 시도였지만, 저에게는 효과가 없었습니다.그것은 대부분 원래 질문에 나열된 사실 1과 아마도 사실 3을 언급하지만, 사실 2는 아닙니다."네, 배열 붕괴로 인해 배열 구독은 포인터 산술을 위한 통사적 설탕으로 생각될 수 있습니다."라고 말할 수 없습니다. (또는 적어도, 당신의 의도가 명확하고 교훈적이라면 그렇게 말할 수 없습니다.)여러분은 "네, 배열 붕괴로 인해, 포인터 산술이 그것과 일치하도록 정의되는 방식 때문에, 배열 첨자는 포인터 산술을 위한 통사적 설탕으로 생각될 수 있습니다"와 같은 말을 해야 합니다. 이것은 완전히 다른 문제입니다.
제가 그렇게 명시적으로 말하지는 않았지만, 저는 표준에서 실제로 사용되는 단어를 포함해야 한다는 요구사항은 없었지만, 공통적이고 널리 받아들여지는 용어를 찾고 있었습니다.그리고 누구도 그런 용어를 기침하지 않았다는 것을 고려할 때, 모든 사람들이 일정한 양의 추측에 관여했다는 것을 고려할 때, 그리고 "어떠냐?저는 관련 사실의 세 가지 이면에 있는 개념에 대해 널리 사용되는 단일 용어는 없다고 결론짓습니다. ("동등성" 외에는 제외됩니다.)
다수의 답변자와 논평자들은 다양한 방식으로 (답변자가 없다고) 이렇게 말했습니다.저는 그 근거로 룬딘의 대답을 받아들일 것이고, 다른 사람들이 그것을 가장 좋아하는 것 같기 때문입니다.
앞으로 저는 "C의 배열과 포인터 간의 대응"을 사용하여 그것이 인기를 얻는지 볼 수 있습니다.배열과 포인터는 남자와 여자만큼 다르고, 실제로는 꽤 멀리 떨어져 있지만, 편지를 자주 주고 받습니다. :-)
이것은 미묘한 질문입니다.영어 소러스와 사전을 검색해보니 유사성이라는 용어가 당신의 맥락에 적합할 수도 있다는 것을 알게 되었습니다.
옥스포드 온라인 사전의 정의에 따르면, 그 단어는Similar
다음과 같이 정의됩니다.
동일하지 않으면서 외모, 성격 또는 수량 면에서 유사성을 갖는 것.
그리고 그 말Similitude
다음과 같이:
어떤 것과 유사한 성질이나 상태.
배열과 포인터가 동일하지는 않지만 때때로 유사하게 취급되기 때문에 다음과 같이 말할 수 있습니다.
예, 어레이/포인터 유사성으로 인해 어레이 서브스크립팅은 포인터 산술을 위한 통사적 설탕으로 생각할 수 있습니다."
이것은 추상적이거나 철학적인 질문처럼 보일 수 있기 때문에, 좀 더 구체적으로 말하자면, 제가 찾고 있는 것은 간단한 명사나 명사구입니다. 저는 이 질문에 대한 대답으로 "네, ___로 인해, 배열 구독은 포인터 산술을 위한 통사적 설탕으로 생각될 수 있습니다."라는 문장을 사용할 수 있습니다.
찾고 있는 구문은 "예, 배열 구독이 후드 아래의 포인터 산술이기 때문에 배열 구독은 포인터 산술을 위한 구문 당으로 생각할 수 있습니다."입니다.
물론 어리석은 일입니다. 왜냐하면 배열 구독이 포인터 산술의 통사적 설탕이라고 말하는 이유는 바로 그것이기 때문입니다. 여러분이 말하는 사람이 '배열 구독', '점자 산술' 또는 '통사적 설탕'이 무엇을 의미하는지 모르는 경우가 아니라면 더 이상의 설명이 필요하지 않습니다.컴파일러가 둘의 차이를 모른다는 것은 아닙니다(그 결과로 얻는 모든 통사적 당에 책임이 있는 사람이기 때문입니다).
이 같은 질문은 더 많은 하위 수준의 명령어를 사용함으로써 우리가 스스로 할 수 있는 언어가 우리를 위해 하는 모든 것에 대해 제기될 수 있습니다. 그리고 그것은 단지 통사적 설탕의 양만 바꾸는 여러 용어를 사용하여 그것을 참조할 수 있습니다.요점은 그들이 다른 것처럼 가장하는 것이 아니라 프로그래밍을 더 쉽게 하는 것입니다([] 연산자를 포인터 산술의 통사적 당으로 사용하지 않고 코드를 작성하는 것을 생각하면, 당신은 그 존재의 이유를 빠르게 깨닫게 됩니다).쓰기, 읽기 및 관리가 더 쉽기 때문입니다.
(그러나 저는 그 질문에 대한 답을 찾고 있는 것이 아니며 "'평등'이라는 단어가 무엇이 문제입니까?"라는 질문에 대한 답을 찾고 있는 것이 아닙니다.네, 저도 압니다. 이것은 학습자들이 배열과 포인터가 어떻게든 같다고 착각하도록 유도할 수 있습니다.이 FAQ 목록 항목을 작성할 때는 이 점을 염두에 두고 있었습니다.)
당신의 질문은 "어레이 구독이 포인터 산술을 위한 통사적 설탕이라는 의미에서 어레이 포인터 동등성에 대한 현대 용어는 무엇입니까?"인 것 같습니다.
답은 다음과 같습니다.
- [] 연산자를 사용하여 배열을 인덱싱할 때 "배열 헤드라인 등록".
- [] 연산자를 사용하는 것과 달리 수동으로 포인터를 이동하는 경우 "포인터 산술".여러분은 또한 [] 연산자에게 제공하는 값에 대해 어떤 수학을 하든지 간에 이 용어를 사용하고 싶을 수도 있습니다. 하지만 여러분은 실제로 포인터 산술을 하는 것이 아니라, 메모리에 있는 객체의 크기를 자동으로 고려하는 통사적 당의 용어인 "인덱스 계산"을 하고 있습니다.다름이 아니라, 쓰기, 읽기 및 관리가 더 쉬우므로, 통사적 설탕)
표준은 변환된 용어를 사용합니다.배열 및 포인터 동등성은 여전히 포인터에 대한 배열 감쇠보다 더 잘 유지됩니다.표준에서는 이 용어를 언급하지 않지만, 어레이와 포인터의 맥락에서 어레이와 포인터 동등성으로 간주되는 것은 프로그래머 간의 상호 이해일 뿐입니다.그리고 포인터와 배열 동등성이 의미하는 것은 포인터 산술과 배열 인덱싱이 C에서 동일하고 포인터와 배열이 다르다는것입니다.
저는 "포인터/어레이 동등성" 또는 "어레이 감쇠"(포인터로)와 같은 용어가 부정확하고 매우 오해의 소지가 있다는 것에 동의합니다.
저는 다음을 제안합니다.
인덱스가 있는 [] 연산자를 사용하여 배열에 액세스하는 경우 포인터 산술식이 동일합니다.그러나 포인터와 배열 사이에는 동등성이 없습니다.포인터의 값(내용)을 기꺼이 변경할 수 있으며, 별도의 반복 카운터를 저장할 수도 있지만, "퇴화된" 배열로는 변경할 수 없습니다. 이 배열은 불변이며, 어떤 면에서는 C++ 참조와 유사한 동작을 보입니다.
영어의 "decayed"와 "to conversion"은 모두 과정에서 원본이 변경된다는 것을 변함없이 전달합니다.배열 이름을 사용하거나 단항 '&' 연산자를 사용해도 피연산자는 변경되지 않습니다.
따라서 "포인터를 양보한다" 또는 "포인터를 생성한다"와 같은 표현이 더 정확할 것입니다. 두 경우 모두 결과 포인터는 (일반적으로) CPU의 GP 레지스터에 있는 임시적인 것이므로 할당할 수 없습니다.
적어도 그것은 제가 이해하는 바입니다, 분해를 보면 그것을 확인할 수 있는 것 같습니다.
형식 변환을 언급하는 경우 '캐스팅'이라는 용어를 사용하는 것은 어떻습니까?컴파일러가 관련 있지만 동일하지 않은 두 가지 유형을 원하는 유형인 것처럼 처리하도록 강요받고 있다는 것은 이미 일반적으로 이해되고 있습니다.예, 여기에 동등성이 있지만 '캐스팅'은 문자 그대로 유형이 동일하지는 않지만 컴파일러가 유형을 다른 유형으로 취급해야 하며, 바이트 > 길이에 대한 업캐스팅과 같이 컴파일러가 해당 절차를 수락할 수 있음을 나타내는 방법으로 사용됩니다.
두 번째 선택: "동의어"
언급URL : https://stackoverflow.com/questions/48868367/whats-a-modern-term-for-array-pointer-equivalence
'source' 카테고리의 다른 글
특정 단추에 기본 '입력'을 설정하는 방법 (0) | 2023.07.03 |
---|---|
'ThunkAction' 유형의 인수를 'AnyAction' 유형의 매개 변수에 할당할 수 없습니다. (0) | 2023.07.03 |
"git reset"과 "git checkout"의 차이점은 무엇입니까? (0) | 2023.07.03 |
Mongodb Mongo 가져오기가 너무 큽니다.오류 구문 분석 실패 (0) | 2023.07.03 |
도커 컴포지트를 사용하여 mongodb에 연결하는 방법은 무엇입니까? (0) | 2023.07.03 |