C + + 파트 2에 포인터와 참조

2009년 5월 2일 ㆍ에 게시된 C / C + +

얘기를 시작 포인터와 참조에 대한 게시물 일련의 이러한 시도와 지속적인 포인터 , 참조 오늘 토론합니다.

참조 개체 별칭에 대한 별칭입니다. 누가이 내가 아니라는 메시지가 나타납니다,하지만 매우 비얀 Stroustrup 하여 5.5의 주제에, 내용을 전 단지 표지가 C.의 형태로 파괴 파도를 가지고 오늘날 통지 너무 좋습니다, 그 표지 좋던데!

선언 참조

특정 형식에 대한 참조는 문자 & (앰퍼샌드 또는 추가하여 선언 앰퍼샌드을 참조 타입의 이름 뒤에). 포인터의 선언에서와 동일한 방식으로, 우리는 평가가 아닌 연산자로 문자로 취급됩니다. 포인터 또는 참조의 선언 아무 연산자 없습니다. 이건 그냥 notational 언어입니다. 타입 T 감안할 때, 그 표현은 T & T Reference를 의미합니다. 예를 들면 다음과 같습니다

 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 I,. / / 처음으로 / / 참고 / / 모든 형태가 동일하지만, 원하는 변수 I.에 대한 참조를 선언하는 형식 참조 참조된 같은 / / 변수해야 INT & RA = 나는;. & RB = INT I; INT & RC = I / / 포인터와 달리, 라인 아래 / / 컴파일 오류를 생성합니다.  & r1, & r2 ; ? 왜 INT & R1, R2  아십니까; 

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 I;
 이중 D;

 rc = c ; 문자 & RC = C;
 ri = i ; INT & RI = I;
 rd = d ; 더블 &= D;

 / / sizeof 연산자는 인수의 유형의 크기는 말합니다.
 "Size of char: " << sizeof ( c ) << " bytes" << endl ; 법정 << "문자의 크기 :"<<sizeof (C) << "바이트"<<endl;
 "Size of int: " << sizeof ( i ) << " bytes" << endl ; 법정 << "정수의 크기 :"<<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 (RI) << "바이트"<<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 & X = RX;
 ry = y ; INT & Y = 스피;

 ; X = 13;
 ; Y = 10;

 ; // A atribuição é automaticamente aplicada em x. RX = 42 / / 할당이 자동으로 엑스에 적용됩니다
 // O incremento é automaticamente aplicado em y. 스피 + + / / 증가는 자동으로 Y까지 적용됩니다

 "x: " << x << endl ; // Valor de x. 법정 << "X :"<<X <<endl / / 가치의 엑스
 "y: " << y << endl ; // Valor de y. 법정 << "Y :"<<Y <<endl / / 값 Y.의
 "rx: " << rx << endl ; // Valor de rx == x. 법정 << "RX :"<<RX <<endl / / 값 == 엑스 RX
 "ry: " << ry << endl ; // Valor de ry == y. 법정 << "스피 :"<<스피 <<endl / / 값 == 스피 Y. 

이러한 참조를 사용하면 프로그래머에게 투명, 그는 참조입니다 알 필요가 없었다. 단순히 일반 변수처럼 사용합니다. 나의 제한된 상상력이 풍부한 사람이 될 수 방법을 볼 수 없습니다 파문 부적 절한 참조를 사용하십시오. 항상 일부 있지만 돼지고기 정신 참조로 똥을 할 수 의해 걸려 얻을 훨씬 쉽습니다 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 & RA =;
 rb = b ; INT & B = RB;

 ; RA = 42;
 ; RB = 7;

 "ra = " << ra << endl ; // O valor de ra == 42. 법정 << "RA ="<<RA <<endl / / RA의 값은 == 42.
 "rb = " << rb << endl ; // O valor de rb == 7. 법정 << "RB ="<<RB <<endl / / RB == 7 값입니다.
 "a = " << a << endl ; // O valor de a == ra == 42. 법정 << "="<<<<endl / / RA의 값은 == == 42.
 "b = " << b << endl ; // O valor de b == rb == 7. 법정 << "B ="<<B <<endl / / RB의 값은 == B == 7.

 "&a = " << & a << endl ; // O endereço de a. 법정 << "& ="<<& <<endl / / 이런 주소
 "&b = " << & b << endl ; // O endereço de b. 법정 << "& B ="<<& B <<endl / / 주소의 B.
 "&ra = " << & ra << endl ; // O endereço de ra == &a. 법정 << "& RA ="<<& RA <RA의 <endl / / 주소 == & A
 "&rb = " << & rb << endl ; // O endereço de rb == &b. 법정 << "& RB ="<<& RB <<endl / / 주소 RB == & B 

라인 17 18 저는 두 정수 변수를 (선언 한 예를 들어이 일을 할 수 ...). 라인 20시 21분 필자는 이전의 두 변수를 참조, 두 참조를 선언합니다. 이후 변수는 RA와 RB는 변수 단지 별칭 아르 A와 B 우리가 앞에서 본대로, 참조에 적용된 연산자가 실제로 참조된 개체에 대한 역할, 각 쌍의는 가변 참조 항상 동일한 가치를 가지고 있으므로.

참고로 흥미로운 부분은 참조의 주소들이 변수 대신 자신의 주소를했다 포인터를 참조 정확히 동일한 주소된다는 것입니다. 왜? 당신은에 빠진 있기 때문에 사기꾼 뽑았다 . 그없이 운영자에 대한 여러분의 참조를 적용 기억나세요? 자, 여기에 사용되는 & 연산자도 참조의 원본 변수와하지에 직접 적용되는 "주소"입니다. 참조의 크기를 얻으려면 닌자를 사용하여 동일한 기법 그들의 주소를 얻기 위해 필요합니다.

다시 재미있는 부분은 참조 메커니즘이 프로그래머를위한 최대한 투명하게하도록 설계한다는 것입니다. 크기와 참조의 물리적 주소는 C의 "정상"을 프로그래밍의 관점에서 관련성이없는 정보입니다 + +.

포인터와 참조의 차이점과 유사점

두 참조에서 우회의 메커니즘으로 포인터 아르 C + +, 또는 메커니즘은 제가 다른 개체를 조작 할 수있어 주어진 기호 (변수)에서 해당하는 데 사용됩니다.

포인터에 대한 주요 사용은 일반적으로 동적 메모리 생성하고 다양한 형태와 특별한 순간의 객체의 파괴뿐만 아니라 (그래서 그것을 인용) "참조에 의한 전달"을 관리하고 조작 관련이 있습니다. 참조가 참조에 의한 전달에 주로 사용되기 때문에 (내가 왜? 궁금)와 연산자 오버.

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

포인터와 참조의 차이점을 이해 나은 수 있도록 흥미로운 우화는 별명입니다. 예를 들면 다음과 같습니다 사람, 말, 그 상상 카를로스 Caetano Bledorn Verri가 . 저희 변수는 원래 개체입니다 Dunga이 이미 카를로스 Caetano Bledorn Verri에 대한 참조, 그것은 동일한 사람과 동일한 개체에 대한 별칭입니다. 이미 꾸준한 손 팬들에 의해 인용입니다 Dunga의 어머니 (카를로스 Caetano Bledorn 또는 Verri, 뭐든)은, 실제로 간접적으로 타겟팅됩니다, 그건 칭찬했다, 어휘 데이터의 특정 사업자, 그것에 대한 포인터를 생각할 수 그것을.

링크

댓글

  • http://caloni.com.br Wanderley Caloni

    좋은 기사!

    불행하게도, 참조들은 것처럼 무해하지 않습니다. 다음과 같은 상황을 상상해 :

    1. 누군가가 아닌 정적 지역 변수에 대한 참조를 반환합니다 :

      QueroEconomizarCopiasDeString ( ) 문자열 & A, QueroEconomizarCopiasDeString ()
     {
        문자열 RET;
        / / 해킹 해킹 해킹
        // espertão... / / 똑똑한 사람 RET 반환 ...
     } 

    이 경우 범위는 사람이 참조를 사용도하기 전에 끝납니다.

    솔루션은 매개 변수로 참조를 얻고 변수 "밖"에 대한 단 하나의 복사본을 만드는 것입니다.

    2. 누군가는 일반 변수로 동적 메모리를 사용하고자합니다

      INT()
     {
        pi = new int ; INT * PI = 새로운 INT;
    
        / 코드의 / 선은 파이 누구가 잊지
    
        amp ; ri = * pi ; // acho ponteiros complicado INT & A, RI = PI * / / 포인터는 어려운 것
    
        코드의 / / 더 라인이 RI와 PI를 잊을
    
        삭제 PI;
    
        / / ... Tcharammm
    
        ; // é a resposta para tudo, não?= 42 / / 아니, 모든에 대한 대답인가?
     } 

    이 예제는 짐승을 보이지만, 그 이름만큼이나 않을 수 없습니다. 단지 코드는 디자인 패턴이나 다른 쓰레기와 함께 이상 glossed하고 무슨 일이 일어 났는지 모르게 터져 수 있습니다.

    [] S

  • http://caloni.com.br Wanderley Caloni

    좋은 기사!

    불행하게도, 참조들은 것처럼 무해하지 않습니다. 다음과 같은 상황을 상상해 :

    1. 누군가가 아닌 정적 지역 변수에 대한 참조를 반환합니다 :

      QueroEconomizarCopiasDeString 문자열  ()
     {
        문자열 RET;
        / / 해킹 해킹 해킹
        // espertão... / / 똑똑한 사람 RET 반환 ...
     } 

    이 경우 범위는 사람이 참조를 사용도하기 전에 끝납니다.

    솔루션은 매개 변수로 참조를 얻고 변수 "밖"에 대한 단 하나의 복사본을 만드는 것입니다.

    2. 누군가는 일반 변수로 동적 메모리를 사용하고자합니다

      INT()
     {
        pi = new int ; INT * PI = 새로운 INT;
    
        / 코드의 / 선은 파이 누구가 잊지
    
        ri = * pi ; // acho ponteiros complicado INT & RI = PI * / / 포인터는 어려운 것
    
        코드의 / / 더 라인이 RI와 PI를 잊을
    
        삭제 PI;
    
        / / ... Tcharammm
    
        ; // é a resposta para tudo, não?= 42 / / 아니, 모든에 대한 대답인가?
     } 

    이 예제는 짐승을 보이지만, 그 이름만큼이나 않을 수 없습니다. 단지 코드는 디자인 패턴이나 다른 쓰레기와 함께 이상 glossed하고 무슨 일이 일어 났는지 모르게 터져 수 있습니다.

    [] S

  • http://blabos.org 공포

    Caloni, 당신은 너무 성급한 사람이에요 :)

    그래요, 당신 말이 맞아요 있습니다. 하지만 그것이 목적에 가자.
    나는 또한 const 포인터 또는 참조에 아직 얘기하지 않았으며 포인터와 배열 사이에 그런 협회,하지만 난 말할 것입니다.

    칭찬에 대한 감사가 정말 동기 부여입니다.

    포옹

  • http://blabos.org 공포

    Caloni, 당신은 너무 성급한 사람이에요 :)

    그래요, 당신 말이 맞아요 있습니다. 하지만 그것이 목적에 가자.
    나는 또한 const 포인터 또는 참조에 아직 얘기하지 않았으며 포인터와 배열 사이에 그런 협회,하지만 난 말할 것입니다.

    칭찬에 대한 감사가 정말 동기 부여입니다.

    포옹

  • http://caloni.com.br Wanderley Caloni

    내 naivete, 난 이미 당신이 말할 때 문제가 닫힌 주어진 줄 알았는데 "그들에게 잠재적인 위험 할 거의가 있기 때문에 머피의 관점에서 참조, 추악한 재​​미 및 어리석은 있습니다."에도 실제로 잘 C와 C 사이의 차이점에 대해 향한있는 사람들을 위해 설명하기 때문에 방법은, 내가 이미 초보에 대한 기사를 추천했습니다 + +.

    나는 sequels 나올 때까지 기다리는 것이 좋습니다.

    [] S

  • http://caloni.com.br Wanderley Caloni

    내 naivete, 난 이미 당신이 말할 때 문제가 닫힌 주어진 줄 알았는데 "그들에게 잠재적인 위험 할 거의가 있기 때문에 머피의 관점에서 참조, 추악한 재​​미 및 어리석은 있습니다."에도 실제로 잘 C와 C 사이의 차이점에 대해 향한있는 사람들을 위해 설명하기 때문에 방법은, 내가 이미 초보에 대한 기사를 추천했습니다 + +.

    나는 sequels 나올 때까지 기다리는 것이 좋습니다.

    [] S

  • http://www.jorgepereira.com.br 호르헤 페레이라

    Blaber 파트너!

    아주 좋아,이 기사에 대한 축하합니다!

    [] S

  • http://www.jorgepereira.com.br 호르헤 페레이라

    Blaber 파트너!

    아주 좋아,이 기사에 대한 축하합니다!

    [] S

  • http://www.caloni.com.br/blog/archives/ultimas-pesquisas-na-blogosfera-nacional Caloni.com.br»블로그 국립 블로그에 아카이브»최신 연구

    [...]의 [...]의 Pointeiros 및 참조

  • http://www.brunodanielmarinho.com 브루노

    법률은 더 이상 대기

  • http://www.brunodanielmarinho.com 브루노

    법률은 더 이상 대기

  • http://blabos.pip.verisignlabs.com/ 공포

    안녕하세요,

    칭찬에 감사드립니다.

    시간이 짧습니다,하지만 난 최대한 빨리 절차를 작성합니다.

  • http://blabos.pip.verisignlabs.com/ 공포

    안녕하세요,

    칭찬에 감사드립니다.

    시간이 짧습니다,하지만 난 최대한 빨리 절차를 작성합니다.

  • 카이로 Rocha

    안녕하세요, 저는 심각한 문제를 가지고 포인터 / 참조로 해결할 수 없습니다.

    나는 반지의 이웃을해야합니다. 예를 들어, 나는 수업을 가지고 수업 A. 세 가지 객체를 선언
    [0]와 [1]의 이웃.
    [1]과 [2]의 이웃.
    [2]와 [0]의 이웃.

    저는 포인터와 참조를 사용했지만, 때, 예를 들어, 업데이트 [1], [0] 변경 "을 참조하십시오"수 없습니다.

  • 물집의 Blaber http://blabos.org

    아무도 당신이 원하는 세부없고 당신이 뭘했는지, 그것은 당신을 도와 어렵습니다.

Disqus에 의해 전원 블로그 코멘트