sourcecode

포인터와 레퍼런스의 실제 차이점은 무엇입니까?

codebag 2023. 9. 20. 20:20
반응형

포인터와 레퍼런스의 실제 차이점은 무엇입니까?

AKA - 포인터에 집착하는 게 뭐죠?

액션스크립트, 자바, C#와 같은 객체 지향적인 현대 언어만을 실제로 사용해 본 저는 포인터의 중요성과 그것을 무엇에 사용하는지 잘 모르겠습니다.여기서 내가 뭘 놓치고 있는 거지?

모든 것은 그냥 간접적인 것입니다.데이터를 다루지 않고 "저쪽에 있는 데이터로 안내해 드리겠습니다."라고 말하는 기능.자바와 C#에서 같은 개념이지만 참조 형식으로만 사용됩니다.

핵심적인 차이점은 참고문헌이 사실상 불변의 표지석이라는 점입니다. 항상 무언가를 가리킵니다.이것은 유용하고 이해하기 쉽지만 C 포인터 모델보다 유연성이 떨어집니다.C 포인터는 행복하게 다시 쓸 수 있는 표지판입니다.찾으시는 끈이 가리키는 끈 바로 옆에 있는 거 아시죠?음, 표지판을 조금만 바꿔주세요.

이는 C의 "뼈에 가깝고 낮은 수준의 지식이 필요한" 접근 방식과 잘 결합됩니다.우리는 그것을 알고 있습니다.char* foo는 푸 표지판이 가리키는 위치에서 시작하는 일련의 문자로 구성됩니다.알 수 소 10할 수 있습니다.(foo + 5)같은 끈을 가리키지만 반은 안쪽으로 시작합니다.

이러한 유연성은 자신이 무엇을 하고 있는지 알고, 모르면 죽음에 이를 때 유용합니다(여기서 "알다"는 것은 단순히 "언어를 안다"는 것 이상의 의미이며, "프로그램의 정확한 상태를 안다"는 것입니다).틀리면, 당신의 표지판이 당신을 벼랑 끝에서 안내하고 있습니다.참조는 사용자가 조작하지 못하도록 하므로 위험 없이 참조를 수행할 수 있다는 자신감이 훨씬 더 높습니다(특히 대부분의 가비지 수집 언어처럼 참조된 개체는 절대 사라지지 않습니다).

당신은 많은 것을 놓치고 있어요!컴퓨터가 낮은 수준에서 작동하는 방식을 이해하는 것은 여러 상황에서 매우 유용합니다.c와 assembler가 당신을 위해 그렇게 해 줄 것입니다.

기본적으로 포인터를 사용하면 컴퓨터 메모리의 모든 지점에 내용을 쓸 수 있습니다.보다 기본적인 하드웨어/OS나 임베디드 시스템에서는 실제로 유용한 기능을 수행할 수 있습니다.깜빡이 불을 다시 켜고 끈다고 하세요.

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

C에서 포인터는 데이터에 대한 참조를 전달하는 방법입니다.함수를 호출할 때 백만 비트를 스택에 복사하고 싶지 않습니다.대신 데이터가 메인 메모리에 있는 위치만 알려주면 됩니다.즉, 데이터에 포인터를 지정하는 것입니다.

그것은 자바에서도 어느 정도 일어나는 일이 벌어집니다.개체 자체가 아니라 개체에 대한 참조를 전달합니다.궁극적으로 모든 개체는 컴퓨터 메인 메모리의 비트 집합이라는 것을 기억하세요.

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

이것이 좋은 일이라고 생각하는지 여부는 여러분에게 달려 있지만, 이것이 C나 어셈블러에서 어떤 일이 이루어지는지에 대한 기본입니다.

고급 언어는 뒤에 포인터를 숨깁니다. 예를 들어 자바의 참조는 여러분이 보게 될 거의 모든 JVM에서 포인터로 구현되므로 NullPointinter라고 합니다.NullReferenceException이 아닌 예외입니다.그러나 프로그래머가 자신이 가리키는 메모리 주소에 직접 접근하지 못하게 하고, 정확한 종류의 객체 주소 이외의 값을 갖도록 수정할 수도 없습니다.따라서 낮은 수준의 언어에서 포인터가 제공하는 것과 같은 힘(및 책임)을 제공하지 않습니다.

[편집: 포인터에 대한 집착은 무엇인가?]라는 질문에 대한 답입니다.지금까지 비교한 것은 자바 레퍼런스가 있는 어셈블러/C 스타일 포인터뿐입니다.그 이후로 질문 제목이 바뀌었습니다: 새로운 질문에 대답하기 위해 시작했다면 Java 이외의 언어로 언급되었을 수도 있습니다.]

이는 마치 "CPU 명령에 집착하는 것은 무엇인가?"라고 묻는 것과 같습니다.x86 MOV 지침서를 사방에 뿌리지 않아 놓치는 것이 있습니까?"

낮은 수준으로 프로그래밍할 때는 포인터만 있으면 됩니다.대부분의 상위 프로그래밍 언어 구현에서 포인터는 C에서와 마찬가지로 광범위하게 사용되지만 컴파일러에 의해 사용자로부터 숨겨집니다.

그러니까... 걱정마요당신은 이미 포인터를 사용하고 있고, 잘못 사용할 위험도 없습니다. :)

저는 자동차 안에서 포인터를 수동 변속기로 봅니다.자동변속기가 장착된 자동차로 운전을 배운다고 해서 운전을 잘 못하는 것은 아닙니다.수동변속기로 학습한 운전자가 할 수 있는 대부분의 일을 여전히 할 수 있습니다.당신의 운전 지식에 구멍이 생길 뿐입니다.만약 당신이 매뉴얼을 운전해야 한다면 당신은 아마 곤경에 처할 것입니다.물론이죠, 기본 개념은 이해하기 쉽지만, 일단 힐 스타트를 해야 하면 망하는 거예요.하지만 아직 수동변속기를 할 수 있는 공간이 남아있습니다.예를 들어, 경주용 자동차 운전자들은 현재의 경주 상황에 가장 최적의 방식으로 반응할 수 있도록 변속할 수 있어야 합니다.수동 변속기를 갖는 것은 그들의 성공에 매우 중요합니다.

이것은 지금 프로그래밍과 매우 비슷합니다.일부 소프트웨어에 C/C++ 개발이 필요합니다.예를 들어 하이엔드 3D 게임, 낮은 레벨의 임베디드 소프트웨어, 속도가 소프트웨어 목적의 중요한 부분인 것, 처리해야 하는 실제 데이터에 더 가까이 접근할 수 있는 낮은 레벨의 언어가 이러한 성능의 핵심입니다.그러나 대부분의 프로그래머에게는 그렇지 않으며 포인터를 모르는 것은 장애가 되지 않습니다.하지만 C와 포인터, 수동 전송에 대해서도 배우면 누구나 이득을 볼 수 있다고 생각합니다.

당신이 객체 지향 언어로 프로그래밍을 해왔으니, 제가 이렇게 표현하겠습니다.

오브젝트 A가 오브젝트 B를 인스턴스화하고, 오브젝트 C에 메소드 파라미터로 전달합니다.개체 C는 개체 B의 일부 값을 수정합니다.오브젝트 A의 코드로 돌아가면 오브젝트 B에서 변경된 값을 확인할 수 있습니다.왜 그럴까요?

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

이제 int 또는 float와 같은 원시 유형을 대신 사용하여 메서드 매개 변수로 전달하면 개체 A에서 개체 C의 변화를 볼 수 없습니다. 개체 A가 변수의 자체 복사본 대신 복사본을 전달했을 뿐이기 때문입니다.이를 기준 값이라고 합니다.

아마 이미 알고 있었을 겁니다.

다시 C 언어로 돌아가서, 함수 A는 함수 B에 몇 가지 변수를 전달합니다.이러한 함수 매개 변수는 기본적으로 By Value 복사본입니다.함수 B가 함수 A에 속한 복사본을 조작하려면 함수 A가 변수에 포인터를 전달해야 기준 통과가 됩니다.

"여보세요, 여기 제 정수 변수의 메모리 주소가 있습니다.그 주소지에 새 값을 넣어두면 나중에 찾아가겠습니다."

이 개념은 유사하지만 100% 유사하지는 않습니다.포인터는 단순히 "참조로" 전달하는 것 이상의 일을 할 수 있습니다.포인터는 임의의 위치의 메모리를 필요한 값으로 조작할 수 있게 해줍니다.포인터는 데이터 변수만이 아닌 임의의 논리를 동적으로 실행하기 위해 실행 코드의 새 주소를 가리킬 때도 사용됩니다.포인터는 다른 포인터(더블 포인터)를 가리킬 수도 있습니다.이는 강력하지만 탐지하기 어려운 버그와 보안 취약성을 도입하기가 매우 쉽습니다.

만약 여러분이 전에 포인터를 본 적이 없다면, 여러분은 분명히 이 작은 보석을 놓치고 있는 것입니다.

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

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

포인터는 메모리 위치가 다른 메모리 위치의 주소도 보유할 수 있다는 것을 깨닫고 우리에게 방향을 제공했습니다.포인터가 없다면 (낮은 수준에서) 대부분의 복잡한 데이터 구조는 불가능할 것입니다.링크된 목록, 이진 트리 또는 해시 테이블이 없습니다.기준 통과가 없고 값으로만 통과합니다.포인터가 코드를 가리킬 수 있기 때문에 포인터가 없으면 가상 함수나 함수 조회 테이블도 없습니다.

일상 업무에서 포인터와 참조를 많이 사용합니다. 관리 코드(C#, Java)와 관리되지 않는(C++, C).저는 스승 자신이 어떻게 포인터를 다루는지와 그것이 무엇인지에 대해 배웠습니다.[빙키!![1] 다른 말은 할 필요가 없습니다 ;)

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

링크1

LINk2

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

우리의 문제와 포인터를 사용하는 언어의 메모리 관리 문제 사이에는 강력한 유사점이 있습니다.제 동료들과 그런 유사점에서 대화할 수 있다는 것은 매우 유용한 일입니다.참조되지 않은 데이터를 삭제하지 않는 것은 "메모리 유출"입니다.아무데도 가지 않는 참조는 "dangling pointer"입니다.명시적인 "무료"를 선택할 수도 있고, "참조 계산"을 사용하여 "쓰레기 수거"를 구현할 수도 있습니다.

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

자바에서는 항상 포인터를 사용합니다.대부분의 변수는 객체에 대한 포인터이므로 다음과 같은 이유가 그 이유입니다.

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

... '헬로 보이즈(Hello boys)'가 아닌 '헬로 보이즈(Hello boys)'

C의 유일한 차이점은 포인터에서 더하고 빼는 것이 일반적이라는 것입니다. 그리고 논리를 틀리면 결국 손대지 말아야 할 데이터를 건드릴 수 있습니다.

문자열은 C(및 기타 관련 언어)의 기본입니다.C에서 프로그래밍을 할 는 메모리를 관리해야 합니다."좋아요, 문자열이 많이 필요해요"라고만 말하는 것이 아니라 데이터 구조에 대해 생각해보셔야 합니다.메모리가 얼마나 필요하십니까?언제 할당하실 겁니까?당신은 언제 그것을 무료로 해주실 겁니까?각 문자열이 80자 이내인 10개의 문자열을 원한다고 가정해 보겠습니다.

좋아요, 각 문자열은 문자 배열입니다. (81자 - null을 잊어서는 안됩니다. 그렇지 않으면 죄송합니다!) 그리고 각 문자열은 배열 자체에 있습니다.최종 결과는 다음과 같은 다차원 배열이 될 것입니다.

char dict[10][81];

참고로, 이 명령어는 " 문자열"이나 "열", "char"가 아닙니다.포인터입니다.문자열 중 하나를 인쇄하려고 하면 하나의 문자의 주소를 전달하는 것뿐입니다. C는 문자를 인쇄하기 시작하면 결국 null이 될 것이라고 가정합니다.그리고 만약 당신이 한 문자열의 시작 부분에 있고 81바이트 앞으로 점프한다면, 당신은 다음 문자열의 시작 부분에 있을 것이라고 가정합니다.그리고 실제로 포인터를 가져가서 81바이트를 더하는 것이 다음 문자열로 이동할 수 있는 유일한 방법입니다.

그렇다면, 왜 포인터가 중요할까요?그들 없이는 아무것도 할 수 없기 때문입니다.수많은 문자열을 출력하는 것과 같은 단순한 작업도 할 수 없습니다. 링크된 목록, 해시, 큐, 트리, 파일 시스템, 메모리 관리 코드, 커널 등을 구현과 같은 흥미로운 작업도 할 수 없습니다.신경쓰지 말아요.C가 당신에게 메모리 블록을 건네주고 나머지는 당신이 하도록 해주기 때문에 당신은 그것들을 이해할 필요가 있습니다. 그리고 원시 메모리 블록으로 무엇이든 하는 것은 포인터가 필요하기 때문입니다.

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

현재 작성된 코드의 90%에서 포인터를 사용한 프로그래밍이 필요하지 않다는 것을 자유롭게 인정합니다. 그리고 사실은 제작 코드에서 완전히 위험합니다.네, 괜찮습니다.그리고 기능적 프로그래밍은 실제로 많이 사용되지 않습니다.동의했다.

하지만 가장 흥미로운 프로그래밍 작업에는 여전히 중요합니다.예를 들어 포인터가 없으면 리눅스 커널에서 작업할 수 없습니다.당신은 정말로 이해하는 포인터 없이는 리눅스의 코드 라인이나, 실제로 어떤 운영 체제도 이해할 수 없습니다.

여기서부터.좋은 기사네요.

솔직히 말하면, 대부분의 노련한 개발자들은 여러분이 조언을 모른다면 웃음이 날 것입니다.이전 직장에서는 작년에 두 명의 신입사원을 뽑았는데(졸업한지 얼마 되지 않았습니다), 그들과 일주일 정도 대화의 주제가 그것뿐이었습니다.어떻게 졸업을 할 수 있는지 아무도 믿을 수가 없었어요

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

C++ 참조 또는.NET byref (와 구별하기 위해 후자의 용어를 사용하겠습니다.NET 참조)는 변수를 고정하지 않고 다른 곳에 고정된 변수(또는 하나로 동작할 수 있는 것)를 식별하기에 충분한 정보를 포함하는 특수한 유형입니다.바이레프는 일반적으로 함수 매개 변수/인수로만 사용되며, 덧셈으로 사용됩니다.함수에 byref를 전달하는 코드는 적어도 함수가 돌아올 때까지 식별된 변수가 존재함을 보장하며 함수는 일반적으로 함수가 돌아온 후에는 byref의 복사본을 유지하지 않도록 보장합니다(C++에서는 후자의 제한이 적용되지 않음).따라서 기준은 그에 따라 식별된 변수보다 오래 지속될 수 없습니다.

자바 및 .참조인 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바이트)를 전달합니다.

자바 클래스는 참조(기본적으로 포인터)를 통해 전달되지만, 프로그래머로부터 숨겨진 자바에서만 전달됩니다.

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

포인터가 어려운 두 가지가 있습니다.

  1. 포인터, 주소 지정 등에 대한 포인터는 매우 모호해질 수 있습니다.그것은 오류로 이어지고, 읽기 어렵습니다.
  2. 포인터가 가리키는 메모리는 종종 힙에서 할당되는데, 이는 당신이 해당 메모리를 해제할 책임이 있다는 것을 의미합니다.애플리케이션이 커질수록 이 요구사항을 따라잡기가 어려워지고, 결국 추적하기 어려운 메모리 누수가 발생합니다.

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

또한 코드 블록을 안전하지 않은 것으로 표시하여 C#에서 포인터를 사용할 수 있습니다(일반 참조와 달리).그러면 메모리 주소를 바꾸는 것을 직접 뛰어다니면서 포인터 연산 등 재미있는 일들을 할 수 있습니다.매우 빠른 이미지 조작(개인적으로 사용한 유일한 장소)에 적합합니다.

자바와 액션스크립트는 안전하지 않은 코드와 포인터를 지원하지 않는 것으로 알고 있습니다.

저는 높은 수준의 언어로 된 포인터나 레퍼런스 같은 것에 집중하는 것에 항상 괴로워합니다."내가 이것의 주소를 거기로 보내면 그것은 다른 것으로 포인터를 돌려줄 것입니다."라는 관점에서 생각하는 것과 반대로 사물의 행동(또는 심지어는 기능)의 관점에서 더 높은 수준의 추상화를 생각하는 것은 정말 유용합니다.

간단한 스왑 기능도 고려해 보십시오.있다면

void 스왑(int & a, int & b)

아니면

절차 스왑(vara, b : 정수)

값을 변경할 수 있음을 의미하는 것으로 해석합니다.이것이 변수들의 주소를 전달함으로써 실행되고 있다는 사실은 단지 목적을 방해하는 것일 뿐입니다.

개체와 마찬가지로 --- 개체 식별자를 포인터나 "서브"에 대한 참조로 생각하지 않습니다.대신 메시지를 보낼 수 있는 객체(objects)라고 생각해 보십시오.C++와 같은 원시 언어에서도 가능한 한 높은 수준으로 생각(및 쓰기)함으로써 훨씬 더 빠르게 진행할 수 있습니다.

c나 c++를 2줄 이상 쓰면 알 수 있습니다.

이들은 변수의 기억 위치에 대한 "점자"입니다.이는 변수를 참조로 전달하는 것과 같습니다.

언급URL : https://stackoverflow.com/questions/92001/what-is-the-real-difference-between-pointers-and-references

반응형