포인터와 C + +에 대한 참조 2 부

5 월 2, 2009 ㆍ 안으로 배치하는 +는 C / C +

평생에 대해 얘기하기 시작, 참조와 포인터와 함께이 시도에 시리즈에 대한 게시물의 포인터 , 참조는 오늘 논의합니다.

참조가 개체 별칭에 대한 별칭입니다. 그리고, 누가 있다고하지만 내가 아니므로이 매우 비얀 Stroustrup , 그의 주제 5.5의 주위에 C, 가장의 콘텐츠 형태입니다 너무 좋아 내가 밖에 통지에 침입 파도가있는 표지 이제는 난 그 표지처럼!

참조 선언

앰퍼샌드 또는 (참조 및 문자를 추가, 특정 유형의 선언에 의해 앰퍼샌드 참조의 유형의 이름을 뒤에). 연산자를 참고 선언에서와 같은 방법은 그 포인터, 아니 평가로서 우리가 치료 캐릭터. 거기 참조 또는 포인터 선언은 운영자. 그것은 단지 언어의 표기법이야. T는 주어진 형식, 그 표현은 참조 티 & T가를 의미합니다. 예를 들면 :

 i ; // Declaram referências para a variável i. // Todas as formas são equivalentes, mas preferimos a primeira. // Note que os tipos das referências tem que ser os mesmos // que os das variáveis referenciadas. int & ra = i ; int & rb = i ; int & rc = i ; // Diferentemente de ponteiros, a linha abaixo gera um // erro de compilação. / / 선언 정수 변수는 원본. / / 등 수도있을 플로 우트 메기,. Int 인 전, 모든 형태는 동일 / / / 선언을 참조하는 변수 / 나지만, 선호하는 첫 번째. / / 참고 종류 참조가 동일해야 수 / / 그 변수가 참조. int & 가시우 = 나, int & RB = 나, int & rc =/ 달리 포인터 / 라인은 아래의 오류를 생성 / / 컴파일.  & r1, & r2 ; 당신은 R2를 & 말할 수있는 이유는? Int 인 & R1,; 

몇 가지만 상기의 C + + 레퍼런스에있는 동안, 그들은 아주 다릅니다. 포인터와 함께 어떻게되는지 달리, 참조가 해당 선언에 초기화해야합니다. 그것에 시간을 컴파일, 컴파일러를 당신의 얼굴에 침을 뱉을 것입니다 즉, 오류를 생성하고 초기화하지 않고 참조를 선언하려는 시도는 "플레이보 분대." 이 규칙은 예외가 유일한 참조로 선언은 통근 자의 대화의 다른 어느 지점에있을 초기화하므로 그들은 프로그램이 있지만 다른 그건.

당신에게 컴파일러를 불평하지 않습니다 초기화하지 않고 통근 자의 참조를 선언하여 속이하려고하면. 그것은, 알았어 사용한 적이있다면. 컴파일러는 똑똑하고 통지 그것이 사용되지 않습니다 경우도 기호의 목록에서 제거할 수 있습니다. 그것은 어디서나 프로그램에 사용하면, 링커가 얼굴에, 웃고, " 'nome_da_variavel에 대한 참조를 정의되지 않은 웃음 것입니다." 그러니 상황이 맞아 않습니다. 에 대한 참조를 선언? 그럼 그렇게 iniclalize. 통근자? 당신은 당신이 무슨 일을하는지 잘 알고 있지?

뒤에 논리 이것은 참조가 뭔가를 이름으로 계획되었습니다입니다. 면, 당신이 부팅하지, 그것은 아무것도, 그리고 나서 그것은 말이되는 이름을하지 않습니다. 아주 중요한 세부 사항 그것이다 그 시작에 값을 할당하지하는 것입니다 참조. prório 비얀가 말하길, 아무 연산자는 참조에 작동 즉, 해당 방법은 할당하고,,, 참조와 빼기 등 추가됩니다. 참조가 개체에 대한 별칭으로, 각 연산자는, 참조에 개체를하지 nese 역할을합니다. 일단, 초기화에 대한 참조는 항상 참조가 같은 개체.

참조하는 최초의 함정뿐만 아니라, 포인터는 크기의 문제입니다. 포인터 (및 기타 데이터 구조의 크기)는 sizeof 연산자와 함께 얻을 수 있지만, 참조의 크기가 종래의 기법으로, 레퍼런스에 sizeof 연산자를 적용하면 이후 얻을 수 없다, 우리는 사실입니다 개체의 연산자를 적용하는가 참조로, 우리는 이전 단락에서 본대로.

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  메기 C;
 int 나;
  d 개;

   rc = c ; 메기 & rc = C;
    ri = i ; int & 도리 = 난;
 rd = d ; 더블 &= d 개;

 / / sizeof 연산자를 말합니다 그 인자의 종류의 크기.
 "Size of char:    " << sizeof ( c ) << " bytes" << endl ; < "크기의 메기 <법정 :"<<sizeof (다) endl "<<<<"바이트;
 "Size of int:     " << sizeof ( i ) << " bytes" << endl ; < "크기의 int <법정 :"<<sizeof은 (i) << "바이트"<<endl;
 "Size of double:  " << sizeof ( d ) << " bytes" << endl ; < "크기의 이중 <법정 :"<<sizeof (d)에 endl "<<<<"바이트;

 endl ; 법원 endl을 <<;

 "Size of char&:   " << sizeof ( rc ) << " bytes" << endl ; << "크기의 코트 & 문자 :"<<sizeof (rc) << "바이트"<<endl;
 "Size of int&:    " << sizeof ( ri ) << " bytes" << endl ; : "<<sizeof 법정 <<"크기의 int (도리) << "바이트"<<endl;
 "Size of double&: " << sizeof ( rd ) << " bytes" << endl ; << "크기의 코트 & 더블 :"<<sizeof (회) << "바이트"<<endl; 

참조의 크기를위한 기법이 텍스트의 범위를 벗어나므로 다루지 않습니다,하지만 난 그들에 대해 나중에 얘기하는 것입니다. 지금은, 난 그저 보여주는하지 않고 말씀 드리죠, 어디에 적용, 참조의 크기가 포인터의 크기와 동일입니다.

이야기의 좋은 부분은 포인터와 참조의 크기가 훨씬 적은 개체의 크기보다 관련성이 자주 지적하거나라고합니다. 난 특히 그 정보를 사용하여, 필요 없었지하지만 개발이나 임베디드 시스템에 대해 서로 다른 아키텍처에 대한, 그것은 더 흥미로운되고있다.

참조를 사용하여

연산자는 주소 또는 드 참조의 압축을 풀 필요가 없습니다 때문에 참조의 사용은 지금 많은 포인터보다 더 간단합니다. 변수 참조는 일반적인 변수로서, 그 작업에 대한 참조에 개체를 항상 수행에 영향을 지적하는 데 사용됩니다 참조.

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
  int x를 y를;
 rx = x ; int & rx = 엑스;
 ry = y ; int & 스피 = y를;

 ; 엑스 = 13;
 ; y를 = 10;

 ; // A atribuição é automaticamente aplicada em x. rx는 = 42 / / 할당 엑스가 적용된 자동
 // O incremento é automaticamente aplicado em y. 스피 + + / / 증가는 당가 적용된 자동

 "x:  " << x << endl ; // Valor de x. 법정 << "엑스 :"<<엑스 <<endl 가치의 엑스 / /
 "y:  " << y << endl ; // Valor de y. 법정 <는 < "y는가 :"<<y는 당 가치 <<endl을 / /
 "rx: " << rx << endl ; // Valor de rx == x. 법정 << "rx는 :"<<rx <<endl / / 값 Rx == 엑스
 "ry: " << ry << endl ; // Valor de ry == y. 법정 <는 < "스피 :"<<스피 <<endl의 / / 값 스피 == 당 

참고로 프로그래머에게 투명 사용하여, 그 참조를 알 필요가 없습니다. 그냥 일반 변수처럼 사용할 수 있습니다. 상상력으로 내 제한될 수 있습니다 사람이 볼 수없는 방법에 파문 부적절하게 용어를 사용합니다. 몇 가지 가지고 있지만 항상 용기 돼지 수 참조와 같은 짓을하는 것입니다 많이 난처하게하기가 쉽습 Saci 포인터를 처리합니다.

주소 및 참고 문헌

의 관점에서 머피 때문에 거기 그들에게 작은 잠재적인 위험 짓을와, 바보 참조하고 지루한, 추악한. 심지어 같은 많은 놀라움 주소 (것입니다?). 고려 아래 코드 :

  17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
  10 ; int = 10;
 13 ; int b = 13;

 ra = a ; int & 가시우 =;
 rb = b ; int & RB = b;

 ; 가시우 = 42;
 ; RB = 7;

 "ra  = " << ra << endl ; // O valor de ra == 42. 법정 << "가시우 ="<<가시우 <<endl / / == 42 가시우의 가치.
 "rb  = " << rb << endl ; // O valor de rb == 7. 법정 << "RB ="<<의 RB <<endl의 / / == 7 RB의 가치.
 "a   = " << a << endl ; // O valor de a == ra == 42. 법정 <는 < "<<<<endl / / 값의 있겠나"= == == 42.
 "b   = " << b << endl ; // O valor de b == rb == 7. 법정 << "b ="<<b <<endl에 / / B의 RB의 값은 == == 7.

 "&a  = " << & a << endl ; // O endereço de a. 법정 << "& ="<<& 주소 마치 <<endl / /
 "&b  = " << & b << endl ; // O endereço de b. < "식사와 침대 ="<<침대 <<endl / / 주소 b. <법원
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 법정 << "& 가시우 ="<<& 가시우 <<endl / / 주소의 가시우 == 답하는 걸로 할께요
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 법정 << "는 & RB ="<<& RB의 <endl </ / 주소의 RB == & b. 

라인의 17시 18분에 난 두 개의 정수 변수를 (예를 들어 한 ...).로 이것을 할 수 있었다면 선언할 라인의 20시 21분에 난 두 개의 참조를 참조 이전의 두 변수를 선언합니다. 이후 변수 가시우과 RB는 변수에 대한 별칭은 그냥 A와 B 우리가 전에 본 마찬가지로 모든 연산자는 참조에 적용된 실제로 참조된 개체에 대해, 그래서 각 쌍의 변수 참조는 항상 동일한 값을 가지고 운영하고 있습니다.

참고로 흥미로운 부분은 참조의 주소가 정확하게 변수의 동일한 주소가 그들이 참조하는, 자신의 주소를 달리했다 포인터입니다. 왜? 에 빠졌 때문에 당신이 Pegadinha Malandro 할 . 모든 연산자의 얘기를 기억이 참조에 적용입니까? 음, 여기에 & 연산자를 사용하지 않을 언급하고있다 적용된 또한 "입니다 주소"직접 변수는 원래. 동일한 기술은 참조의 크기를 얻을 닌자를 사용하여 그들의 주소를 얻기 위해 필요합니다.

또 재미있는 부분은 참조 메커니즘으로 프로그래머에게 가능한 한 투명하게되도록 제작되었습니다입니다. 크기와 참고 문헌의 물리적 주소는 C + +에서 '정상'프로그램의 관점에서 무관한 정보입니다.

차이와 포인터 그리고 참조 사이의 유사성

두 포인터와 참조는 C + +, 또는 메커니즘의 우회의 메커니즘을 그렇게 주어진 기호 (변수)부터 난 다른 개체를 조작할 수있을 것입니다 사용됩니다.

포인터에 대한 주요 사용은 일반적으로 관리 및 동적 메모리 조작, 생성 및 다양한 모양과 특별한 순간뿐만 아니라 개체의 파괴와 관련이 있습니다 "참조에 의해 매개 변수를 전달"(그래서)를 인용했다. 참고 이미 참조에 의해 (왜?) 및 연산자 오버 패스에서 사용되고 있습니다.

기본적으로, 우리 모두가 참조가 포인터로 에뮬레이트 수와 함께 할 수 있습니다. 이미 서로 항상 사실이 아니다. 그들의 가장 큰 장점은, 그러나, 우회 완전히 프로그래머에게 투명하게 될 수 있습니다.

재미있는 우화 더 포인터와 참조의 차이점을 이해하는데 도움이 별명입니다. 말, 사람에 대한 예 : 상상 그 둥가 .는 우리의 원래의 변수, 개체 둥가 개체입니다 대한 별칭 같은 그것은 이후 둥가, 이미 사람에 대한 참조와 같은. 이미 둥가 어머니 (또는 둥가, 뭐든간에)는, 어떤 사람들인가로 긴 인용으로, 그것에 포인터로 간주 될 수 있기 때문에 특정 데이터 칭찬 사업자 어휘, 만든 그녀, 실제로 타겟으로 간접적으로 그를.

링크

댓글

  • 안녕하세요,

    난 칭찬에 감사드립니다.

    시간이 짧은 것이지만, 가능한 한 빨리 sequels를 써주세요.
  • 추가 법적 기다리는
  • 파트너 공포!

    축하 기사, 아주 좋아합니다!

    []는 S
  • 내 천진 난만함, 그건 그 문제는 이미 당신이 "거의 가능성 위험 그들과 함께 할 수 있기 때문에 머피의 관점에서, 참조 추한, 지루하고, 바보라고 말했다 닫혀 있었다고 생각입니다." 어쨌든, 이미 귀하의 문서를 권장 그것은 실제로 아주 잘 설명하는 자들 C와 C + +의 차이점에 대한 탐험하는위한 초급 때문이다.

    내가 sequels 찾습니다.

    []는 S
  • 멋진 기사!

    불행하게도, 참조만큼 그들이 보이는 해롭지 않습니다. 다음과 같은 상황을 상상해 :


    1. 비 정적 로컬 변수에 누군가에 대한 참조를 반환합니다 :


    QueroEconomizarCopiasDeString & 문자열 ()
    (
    문자열 부드럽게하기 위해 물에 담그다;
    / / 해킹 해킹 해킹
    반환 부드럽게하기 위해 물에 담그다; / / 똑똑한 사람 ...
    )


    이 경우의 범위도 전에 누군가가 참조를 사용하여 종료됩니다.

    이 솔루션은 매개 변수로 참조를 가져오기 위해 단 하나의 복사본을 만들어야합니다 :에 대한 변수를 '아웃'.


    2. 누군가가 일반 변수를 동적으로 메모리를 사용하고 싶어 :


    int 주 ()
    (
    int * 파이 = 새로운 int;

    / / 라인의 코드 누구 파이는 잊고

    int & 도리 = 파이 *는 / / 나는 포인터는 복잡한 것 같아

    코드 / / 기타 라인 도리와 파이를 잊지

    삭제 파이;

    / / Tcharammm ...

    도리 = 42 / / 모두에 대한 해답, 아니 무엇입니까?
    )



    이러한 예제,하지만 희한하지로 그들은 짐승을 보이는 것 같습니다. 단순히 코드가 디자인 패턴 또는 다른 말도 이상 glossed해야하고 당신이 없으면 무슨 일이 있었는지 알고 폭발.

    []는 S
  • Caloni, 넌 남자 잖아 너무 급하게 :)

    네, 꽤 괜찮 있습니다. 하지만 그것이 목적에 가자.
    나 또한 아직 포인터 또는 참조를 const에 없으며 심지어는 포인터와 어레이 사이에 협회,하지만 난 말할 것이다 이야기를하지 않았습니다.

    칭찬을 주셔서 감사합니다, 아주 동기를 부여이야.

    건배
블로그 Disqus에 의해 제공 코멘트