문제

일명 - 포인터에 대한 집착은 무엇인가요?

저는 ActionScript, Java, C#과 같은 최신 객체 지향 언어만 사용해 왔기 때문에 포인터의 중요성과 포인터를 사용하는 목적을 잘 이해하지 못합니다.내가 여기서 무엇을 놓치고 있는 걸까요?

도움이 되었습니까?

해결책

그것은 모두 간접적인 것일 뿐입니다.데이터를 다루지 않고 "저기 데이터를 알려줄게"라고 말하는 능력.Java와 C#에는 동일한 개념이 있지만 참조 형식에서만 사용됩니다.

주요 차이점은 참조가 사실상 불변의 표지판이라는 점입니다. 참조는 항상 무언가를 가리킵니다.이는 유용하고 이해하기 쉽지만 C 포인터 모델보다 유연성이 떨어집니다.C 포인터는 즐겁게 다시 작성할 수 있는 표지판입니다.당신이 찾고 있는 문자열이 가리키는 문자열 옆에 있다는 것을 알고 있습니까?글쎄요, 표지판을 살짝만 바꾸세요.

이는 C의 "본질에 가깝고 낮은 수준의 지식이 필요한" 접근 방식과 잘 어울립니다.우리 알다 char* foo foo 표지판이 가리키는 위치에서 시작하는 문자 집합으로 구성됩니다.문자열의 길이가 10자 이상이라는 것도 알고 있는 경우 표지판을 다음으로 변경할 수 있습니다. (foo + 5) 동일한 문자열을 가리키지만 길이의 절반부터 시작합니다.

이러한 유연성은 자신이 하고 있는 일을 알 때 유용하고, 그렇지 않으면 사망합니다(여기서 "알다"는 것은 "언어를 아는 것" 이상이며 "프로그램의 정확한 상태를 아는 것"입니다).잘못 생각하면 이정표가 당신을 절벽 가장자리로 안내하고 있습니다.참조는 조작을 허용하지 않으므로 위험 없이 참조를 따라갈 수 있다는 확신이 훨씬 더 커집니다(특히 대부분의 가비지 수집 언어에서와 같이 "참조된 개체는 절대 사라지지 않습니다"와 같은 규칙과 결합된 경우).

다른 팁

당신은 많은 것을 놓치고 있습니다!낮은 수준에서 컴퓨터가 어떻게 작동하는지 이해하는 것은 여러 상황에서 매우 유용합니다.C와 어셈블러가 그 일을 해줄 것입니다.

기본적으로 포인터를 사용하면 컴퓨터 메모리의 어느 지점에나 내용을 쓸 수 있습니다.보다 원시적인 하드웨어/OS 또는 임베디드 시스템에서 이는 실제로 유용한 작업을 수행할 수 있습니다.깜박이는 조명을 켰다가 다시 끄라고 해보세요.

물론 이것은 최신 시스템에서는 작동하지 않습니다.운영체제는 메인 메모리의 주인이자 주인이다.잘못된 메모리 위치에 액세스하려고 하면 프로세스는 오만함의 대가를 생명으로 치르게 됩니다.

C에서 포인터는 데이터에 대한 참조를 전달하는 방법입니다.함수를 호출할 때 백만 비트를 스택에 복사하고 싶지는 않습니다.대신 데이터가 주 메모리의 어디에 있는지 알려줍니다.즉, 당신은 바늘 데이터에.

어느 정도는 Java에서도 마찬가지입니다.객체 자체가 아닌 객체에 대한 참조를 전달합니다.궁극적으로 모든 객체는 컴퓨터 메인 메모리의 비트 집합이라는 점을 기억하십시오.

포인터는 메모리의 내용을 직접 조작하기 위한 것입니다.

이것이 좋은 일이라고 생각하는지 여부는 당신에게 달려 있지만, 이는 C나 어셈블러에서 모든 작업이 수행되는 방식의 기초입니다.

고급 언어는 화면 뒤에 포인터를 숨깁니다.예를 들어 Java의 참조는 여러분이 접하게 될 거의 모든 JVM에서 포인터로 구현되므로 NullReferenceException이 아닌 NullPointerException이라고 합니다.하지만 프로그래머가 자신이 가리키는 메모리 주소에 직접 접근할 수 없으며, 올바른 유형의 객체 주소 이외의 값을 취하도록 수정할 수도 없습니다.따라서 저수준 언어의 포인터와 동일한 기능(및 책임)을 제공하지 않습니다.

[편집하다:'이 포인터에 대한 집착은 무엇입니까?'라는 질문에 대한 답변입니다.내가 비교한 것은 Java 참조가 포함된 어셈블러/C 스타일 포인터뿐입니다.이후 질문 제목이 변경되었습니다.새로운 질문에 답하기 시작했다면 Java 이외의 언어로 언급했을 수도 있습니다.]

이는 "CPU 명령에 대한 집착은 무엇입니까?"라고 묻는 것과 같습니다.x86 MOV 명령어를 여기저기 뿌리지 않아서 뭔가를 놓치고 있는 걸까요?”

방금 필요 낮은 수준에서 프로그래밍할 때 포인터.대부분의 고급 프로그래밍 언어 구현에서 포인터는 C에서처럼 광범위하게 사용되지만 컴파일러에 의해 사용자에게는 숨겨집니다.

그래서...괜찮아요.당신은 이미 포인터를 사용하고 있으며, 잘못 사용할 위험도 없습니다.:)

나는 포인터를 자동차의 수동변속기로 본다.자동 변속기가 있는 자동차로 운전하는 법을 배운다고 해서 나쁜 운전자가 되는 것은 아닙니다.그리고 수동 변속기에 대해 배운 운전자가 할 수 있는 대부분의 작업을 여전히 수행할 수 있습니다.운전 지식에 구멍이 생길 것입니다.수동으로 운전해야 한다면 아마도 문제가 생길 것입니다.물론, 그것의 기본 개념을 이해하는 것은 쉽지만, 일단 언덕 출발을 해야 한다면, 당신은 망합니다.하지만 아직 수동변속기가 가능한 곳이 있습니다.예를 들어, 경주용 자동차 운전자는 자동차가 현재 경주 조건에 가장 최적의 방식으로 반응하도록 변속할 수 있어야 합니다.수동 변속기를 갖는 것은 성공에 매우 중요합니다.

이것은 현재 프로그래밍과 매우 유사합니다.일부 소프트웨어에서는 C/C++ 개발이 필요합니다.몇 가지 예로는 고급 3D 게임, 낮은 수준의 임베디드 소프트웨어, 속도가 소프트웨어 목적의 중요한 부분, 처리해야 하는 실제 데이터에 더 가까이 액세스할 수 있는 낮은 수준의 언어 등이 해당 성능의 핵심입니다. .그러나 대부분의 프로그래머에게는 그렇지 않으며 포인터를 모른다고 해서 문제가 되는 것은 아닙니다.그러나 나는 C와 포인터, 그리고 수동 변속기에 대해서도 배우면 모든 사람이 이익을 얻을 수 있다고 믿습니다.

당신은 객체지향 언어로 프로그래밍을 해왔기 때문에 이렇게 표현하겠습니다.

객체 A를 가져와서 객체 B를 인스턴스화하고 이를 객체 C에 메서드 매개 변수로 전달합니다.객체 C는 객체 B의 일부 값을 수정합니다.객체 A의 코드로 돌아가면 객체 B에서 변경된 값을 볼 수 있습니다.왜 그럴까요?

당신이 합격했기 때문에 참조 개체 B를 개체 C로 복사하고 개체 B의 또 다른 복사본을 만들지 않았습니다.따라서 객체 A와 객체 C는 모두 메모리에서 동일한 객체 B에 대한 참조를 보유합니다.한 곳에서 변화하고 다른 곳에서 볼 수 있습니다.이를 참조 기준이라고 합니다.

이제 int 또는 float와 같은 기본 유형을 대신 사용하고 이를 메소드 매개변수로 전달하는 경우 객체 A는 단지 객체 C의 변경 사항을 객체 A에서 볼 수 없습니다. 복사 변수의 자체 복사본에 대한 참조 대신.이를 값별이라고 합니다.

당신은 아마 이미 그것을 알고 있었을 것입니다.

C 언어로 돌아가면 함수 A는 함수 B에 일부 변수를 전달합니다.이러한 함수 매개변수는 기본적으로 값별 복사본입니다.함수 B가 함수 A에 속한 복사본을 조작하려면 함수 A가 다음을 전달해야 합니다. 바늘 참조에 의한 전달이 되도록 변수에 추가합니다.

"여기 내 정수 변수에 대한 메모리 주소가 있습니다.해당 주소 위치에 새 값을 입력하면 나중에 가져오겠습니다."

개념은 비슷하지만 100% 유사하지는 않습니다.포인터는 단순히 "참조로" 전달하는 것보다 더 많은 일을 할 수 있습니다.포인터를 사용하면 함수가 임의의 메모리 위치를 필요한 값으로 조작할 수 있습니다.포인터는 또한 새로운 주소를 가리키는 데 사용됩니다. 실행 코드 데이터 변수뿐만 아니라 임의의 논리를 동적으로 실행합니다.포인터는 다음을 가리킬 수도 있습니다. 다른 포인터 (이중 포인터).이는 강력하지만 감지하기 어려운 버그와 보안 취약점을 도입하기가 매우 쉽습니다.

이전에 포인터를 본 적이 없다면 분명히 이 미니 보석을 놓치고 있는 것입니다.

void strcpy(char *dest, char *src)
{    
        while(*dest++ = *src++);
}

역사적으로 프로그래밍을 가능하게 한 것은 메모리 위치가 데이터뿐만 아니라 컴퓨터 명령을 저장할 수 있다는 인식이었습니다.

포인터는 메모리 위치가 다른 메모리 위치의 주소도 보유할 수 있어 간접적인 정보를 제공할 수 있다는 인식에서 탄생했습니다.포인터가 없으면(낮은 수준에서) 가장 복잡한 데이터 구조는 불가능합니다.연결된 목록, 이진 트리 또는 해시 테이블이 없습니다.참조로 전달하지 않고 값으로만 ​​전달합니다.포인터는 코드를 가리킬 수 있으므로 포인터가 없으면 가상 함수나 함수 조회 테이블도 없습니다.

저는 일상 업무에서 관리 코드(C#, Java) 및 비관리 코드(C++, C)에서 포인터와 참조를 많이 사용합니다.포인터를 어떻게 다루는지, 포인터가 무엇인지 마스터님께서 직접 배웠습니다...[Binky!!][1] 더 말할 필요도 없습니다 ;)

포인터와 참조의 차이점은 다음과 같습니다.포인터는 일부 메모리 블록에 대한 주소입니다.이는 다시 쓰여질 수 있습니다. 즉, 다른 메모리 블록에 재할당될 수 있습니다.참조는 단순히 일부 개체의 이름을 바꾸는 것입니다.한 번만 할당할 수 있습니다!한 개체에 할당되면 다른 개체에 할당할 수 없습니다.참조는 주소가 아니라 변수의 또 다른 이름입니다.확인해 보세요 C++ FAQ 이에 대한 자세한 내용은.

링크1

링크2

나는 현재 하나 이상의 다른 엔터티에서 데이터 덩어리(이 경우 SQL 데이터베이스에 저장됨)를 참조하는 일부 고급 엔터프라이즈 소프트웨어를 설계하는 데 전념하고 있습니다.더 이상 참조하는 엔터티가 없는데 데이터 덩어리가 남아 있다면 스토리지를 낭비하는 것입니다.참조 지점이 존재하지 않는 데이터인 경우에도 큰 문제가 됩니다.

우리의 문제와 포인터를 사용하는 언어의 메모리 관리 문제 사이에는 강력한 유사점이 있습니다.그러한 비유에 관해 동료들과 이야기를 나눌 수 있다는 것은 매우 유용합니다.참조되지 않은 데이터를 삭제하지 않는 것은 "메모리 누수"입니다.아무데도 가지 않는 참조는 "매달린 포인터"입니다.명시적인 "해제"를 선택하거나 "참조 계산"을 사용하여 "가비지 수집"을 구현할 수 있습니다.

따라서 낮은 수준의 메모리 관리를 이해하는 것은 높은 수준의 애플리케이션을 설계하는 데 도움이 됩니다.

Java에서는 항상 포인터를 사용합니다.대부분의 변수는 객체에 대한 포인터입니다. 그 이유는 다음과 같습니다.

StringBuffer x = new StringBuffer("Hello");
StringBuffer y = x;
x.append(" boys");
System.out.println(y);

..."Hello"가 아닌 "Hello boys"를 인쇄합니다.

C의 유일한 차이점은 포인터에서 더하고 빼는 것이 일반적이라는 것입니다. 논리가 잘못되면 건드리지 말아야 할 데이터가 엉망이 될 수 있습니다.

문자열은 C(및 기타 관련 언어)의 기본입니다.C로 프로그래밍할 때, 기억을 관리해야 합니다.단순히 "알겠습니다. 문자열이 많이 필요합니다"라고 말하는 것이 아닙니다.데이터 구조를 생각해야 합니다.얼마나 많은 메모리가 필요합니까?언제 할당할 건가요?언제 풀어주나요?각각 80자를 넘지 않는 10개의 문자열이 필요하다고 가정해 보겠습니다.

좋아요, 각 문자열은 문자 배열입니다(81자 - null을 잊어버리면 안 됩니다!). 그러면 각 문자열 자체가 배열에 포함됩니다.최종 결과는 다음과 같은 다차원 배열이 될 것입니다.

char dict[10][81];

참고로 dict는 "문자열", "배열" 또는 "문자"가 아닙니다.포인터입니다.이러한 문자열 중 하나를 인쇄하려고 할 때 수행하는 작업은 단일 문자의 주소를 전달하는 것뿐입니다.C에서는 문자 인쇄를 시작하면 결국에는 null이 발생한다고 가정합니다.그리고 한 문자열의 시작 부분에 있고 81바이트 앞으로 이동하면 다음 문자열의 시작 부분에 있게 될 것이라고 가정합니다.그리고 실제로 포인터를 가져와서 81바이트를 추가하는 것은 유일한 방법 다음 문자열로 점프합니다.

그렇다면 포인터가 왜 중요한가요?그들 없이는 아무것도 할 수 없기 때문입니다.여러 문자열을 인쇄하는 것과 같은 간단한 작업도 수행할 수 없습니다.너 틀림없이 연결된 목록, 해시, 큐, 트리, 파일 시스템, 일부 메모리 관리 코드, 커널 등을 구현하는 것과 같은 흥미로운 작업을 수행할 수 없습니다.C는 단지 메모리 블록을 건네주고 나머지는 여러분이 하도록 하고, 원시 메모리 블록으로 무엇이든 하려면 포인터가 필요하기 때문에 이를 이해해야 합니다.

또한 많은 사람들은 포인터를 이해하는 능력이 프로그래밍 기술과 높은 상관관계가 있다고 제안합니다.조엘은 무엇보다도 이런 주장을 했습니다.예를 들어

이제 저는 오늘날 작성된 코드의 90%에서 포인터를 사용한 프로그래밍이 필요하지 않으며 실제로 프로덕션 코드에서는 완전히 위험하다는 점을 자유롭게 인정합니다.좋아요.괜찮아.그리고 함수형 프로그래밍은 실제로 많이 사용되지 않습니다.동의했습니다.

하지만 가장 흥미로운 프로그래밍 작업에서는 여전히 중요합니다.예를 들어 포인터가 없으면 Linux 커널에서 작업할 수 없습니다.포인터를 제대로 이해하지 않으면 Linux나 어떤 운영 체제의 코드 한 줄도 이해할 수 없습니다.

에서 여기.훌륭한 기사.

솔직히 말해서 대부분의 노련한 개발자는 포인터를 모른다면 웃을 것입니다.이전 직장에서는 작년에 신입사원(방금 졸업한) 두 명이 포인터에 대해 전혀 모르는 사람이 있었는데, 그것만으로도 일주일 정도 그들과 대화의 주제였습니다.누군가가 지침도 모르고 졸업할 수 있다는 것을 아무도 믿을 수 없습니다...

C++의 참조는 Java 또는 .NET 언어의 참조와 근본적으로 다릅니다..NET 언어에는 C++ "참조"와 매우 유사하게 동작하는 "byrefs"라는 특수 유형이 있습니다.

C++ 참조 또는 .NET byref(.NET 참조와 구별하기 위해 후자를 사용함)는 변수를 보유하지 않지만 변수(또는 동작할 수 있는 항목)를 식별하는 데 충분한 정보를 보유하는 특수 유형입니다. 예를 들어 어레이 슬롯과 같이 다른 곳에 보관됩니다.Byref는 일반적으로 함수 매개변수/인수로만 사용되며 일시적입니다.byref를 함수에 전달하는 코드는 식별된 변수가 최소한 해당 함수가 반환될 때까지 존재함을 보장하고 함수는 일반적으로 반환 후에 byref의 복사본을 유지하지 않도록 보장합니다(C++에서는 후자의 제한이 적용되지 않음). 시행).따라서 byref는 식별된 변수보다 오래 지속될 수 없습니다.

Java 및 .NET 언어에서 참조는 힙 개체를 식별하는 유형입니다.각 힙 개체에는 연결된 클래스가 있으며 힙 개체 클래스의 코드는 개체에 저장된 데이터에 액세스할 수 있습니다.힙 개체는 내부에 저장된 데이터에 대해 외부 코드에 제한된 또는 전체 액세스 권한을 부여하거나 외부 코드가 해당 클래스 내의 특정 메서드를 호출하도록 허용할 수 있습니다.해당 클래스의 메서드 호출에 대한 참조를 사용하면 해당 메서드에서 해당 참조를 사용할 수 있게 되며, 그런 다음 이를 사용하여 힙 개체 내의 데이터(개인 데이터도 포함)에 액세스할 수 있습니다.

Java 및 .NET 언어에서 참조를 특별하게 만드는 것은 Null이 아닌 모든 참조가 해당 참조가 존재하는 한 동일한 힙 개체를 계속 식별한다는 절대 불변성을 유지한다는 것입니다.힙 개체에 대한 참조가 우주 어디에도 존재하지 않으면 힙 개체는 단순히 더 이상 존재하지 않게 됩니다. 그러나 힙 개체에 대한 참조가 존재하는 동안 힙 개체가 더 이상 존재하지 않을 수 없으며 "정상적인 개체"에 대한 방법도 없습니다. " 힙 객체에 대한 참조를 사용하면 해당 객체에 대한 참조가 아닌 다른 것이 자연스럽게 됩니다.Java와 .NET에는 모두 특별한 "약한 참조" 유형이 있지만 불변성을 유지합니다.개체에 대한 약한 참조가 유니버스 어디에도 존재하지 않으면 기존 약한 참조는 모두 무효화됩니다.그런 일이 발생하면 개체에 대한 참조가 없으므로 무효화될 수 있습니다.

C++ 참조 및 Java/.NET 참조와 같은 포인터는 개체를 식별하지만 앞서 언급한 참조 유형과 달리 식별하는 개체보다 오래 지속될 수 있습니다.포인터로 식별된 개체가 더 이상 존재하지 않지만 포인터 자체는 존재하지 않는 경우 포인터를 사용하려고 하면 정의되지 않은 동작이 발생합니다.포인터가 어느 쪽인지도 알려지지 않은 경우 null 또는 현재 존재하는 객체를 식별하기 위해 수행할 표준으로 정의된 방법이 없습니다. 아무것 다른 포인터로 덮어쓰지 말고 해당 포인터를 사용하세요.아무것도 포인터를 사용하지 않는 한 식별된 개체가 더 이상 존재하지 않은 후에도 포인터가 계속 존재하는 것은 완전히 합법적입니다. 그러나 포인터 외부의 무언가가 포인터를 사용하는 것이 안전한지 여부를 나타내는 것이 필요합니다. 포인터 자체에 물어보세요.

포인터와 참조(두 유형 모두)의 주요 차이점은 참조가 유효한지 항상 물어볼 수 있으며(유효하거나 null로 식별 가능함) 유효한 것으로 관찰되면 참조가 유효한 한 유지된다는 것입니다. 존재하다.포인터가 유효한지 물어볼 수 없으며 시스템은 포인터가 유효하지 않게 되는 것을 보장하거나 유효하지 않게 된 포인터가 포인터로 인식되는 것을 허용하지 않습니다.

오랫동안 나는 포인터를 이해하지 못했지만 배열 주소 지정은 이해했습니다.그래서 나는 일반적으로 배열의 객체에 대한 일부 저장 영역을 구성한 다음 해당 배열에 대한 인덱스를 '포인터' 개념으로 사용합니다.

SomeObject store[100];
int a_ptr = 20;
SomeObject A = store[a_ptr];

이 접근 방식의 한 가지 문제점은 'A'를 수정한 후 변경 사항을 영구적으로 적용하려면 'store' 배열에 다시 할당해야 한다는 것입니다.

store[a_ptr] = A;

그 뒤에서 프로그래밍 언어는 여러 가지 복사 작업을 수행하고 있었습니다.대부분의 경우 이는 성능에 영향을 미치지 않았습니다.이는 대부분 코드를 오류가 발생하기 쉽고 반복적으로 만들었습니다.

포인터를 이해하는 방법을 배운 후에는 배열 주소 지정 방식 구현에서 벗어났습니다.그 비유는 여전히 꽤 유효합니다.'저장소' 배열이 프로그래밍 언어의 런타임에 의해 관리된다는 점을 고려하세요.

SomeObject A;
SomeObject* a_ptr = &A;
// Any changes to a_ptr's contents hereafter will affect
// the one-true-object that it addresses. No need to reassign.

요즘에는 개체를 합법적으로 복사할 수 없는 경우에만 포인터를 사용합니다.이런 일이 발생하는 데에는 여러 가지 이유가 있습니다.

  1. 성능을 위해 값 비싼 객체-코피 작동을 피합니다.
  2. 다른 요소는 객체-카피 작동을 허용하지 않습니다.
  3. 객체에 부작용을 갖도록 함수 호출을 원합니다 (물체를 전달하지 말고 포인터를 전달하십시오).
  4. 일부 언어에서는 함수에서 둘 이상의 값을 반환하려는 경우 (일반적으로 피하기).

포인터는 하위 수준 프로그래밍 언어에서 간접 참조를 나타내는 가장 실용적인 방법입니다.

포인터가 중요해요!그들은 메모리 주소를 "가리키고" 많은 내부 구조가 포인터로 표시됩니다. 즉, 문자열 배열은 실제로 포인터에 대한 포인터 목록입니다!포인터는 함수에 전달된 변수를 업데이트하는 데에도 사용될 수 있습니다.

스택에 메모리를 미리 할당하지 않고 런타임에 "객체"를 생성하려는 경우 필요합니다.

매개변수 효율성 - 전체(임의로 큰) 객체를 복사하는 것과 반대로 포인터(Int - 4바이트)를 전달합니다.

Java 클래스는 참조(기본적으로 포인터)를 통해 전달됩니다. 프로그래머에게 숨겨진 Java의 클래스입니다.

C 및 C++와 같은 언어로 프로그래밍하는 것은 "메탈"에 훨씬 더 가깝습니다.포인터는 변수, 데이터, 함수 등이 저장되는 메모리 위치를 보유합니다.살다.값을 전달하는 대신(변수 및 데이터 복사) 포인터를 전달할 수 있습니다.

포인터에는 어려운 점이 두 가지 있습니다.

  1. 포인터에 대한 포인터, 주소 지정 등매우 비밀스러워질 수 있습니다.오류가 발생하고 읽기가 어렵습니다.
  2. 포인터가 가리키는 메모리는 종종 힙에서 할당됩니다. 즉, 해당 메모리를 해제할 책임은 사용자에게 있습니다.애플리케이션이 커질수록 이 요구 사항을 충족하기가 더 어려워지고 결국 추적하기 어려운 메모리 누수가 발생하게 됩니다.

포인터 동작을 Java 개체가 전달되는 방식과 비교할 수 있습니다. 단, Java에서는 메모리 해제가 가비지 수집에 의해 처리되므로 메모리 해제에 대해 걱정할 필요가 없습니다.이렇게 하면 포인터에 대한 좋은 점을 얻을 수 있지만 부정적인 점은 다룰 필요가 없습니다.물론 객체를 역참조하지 않으면 Java에서 메모리 누수가 발생할 수 있지만 이는 다른 문제입니다.

또한 주목해야 할 점은 코드 블록을 안전하지 않은 것으로 표시하여 C#에서 포인터를 사용할 수 있다는 것입니다(일반 참조와 반대).그런 다음 메모리 주소를 직접 변경하고 포인터 연산 및 모든 재미있는 작업을 수행할 수 있습니다.매우 빠른 이미지 조작에 적합합니다(제가 개인적으로 사용한 유일한 곳입니다).

내가 아는 한 Java와 ActionScript는 안전하지 않은 코드와 포인터를 지원하지 않습니다.

나는 고급 언어의 포인터나 참조와 같은 것에 초점을 맞추는 것에 항상 괴로워합니다."내가 이것의 주소를 저기로 보내면 저것이 저쪽에 있는지 보자"라는 관점으로 생각하는 것과는 반대로 객체의 동작(또는 심지어 함수)의 관점에서 더 높은 수준의 추상화에서 생각하는 것이 정말 유용합니다. 나에게 다른 것에 대한 포인터를 돌려줄 것이다"

간단한 스왑 기능도 고려해보세요.당신이 가지고 있다면

무효 교환(int & a, int & b)

또는

절차 Swap(var a, b :정수)

그런 다음 이를 값이 변경될 수 있음을 의미하는 것으로 해석합니다.이것이 변수의 주소를 전달하여 구현된다는 사실은 목적을 방해하는 것일 뿐입니다.

객체와 동일합니다. 객체 식별자를 "물건"에 대한 포인터나 참조로 생각하지 마십시오.대신, 메시지를 보낼 수 있는 객체라고 생각하세요.C++와 같은 원시 언어에서도 가능한 한 높은 수준에서 생각하고 작성하면 훨씬 더 빠르게 더 나아갈 수 있습니다.

c 또는 c++를 2줄 이상 작성하면 알게 될 것입니다.

이는 변수의 메모리 위치에 대한 "포인터"입니다.이는 참조로 변수를 전달하는 것과 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top