참조 해제 연산자

Dereference operator

컴퓨터 프로그래밍에서 디레퍼런스 연산자 또는 간접 연산자, 때로는 "로 표시된다.*(아스터리스크)는 포인터 변수를 포함하는 C-유사 언어에서 발견되는 단항 연산자(즉, 단일 피연산자)이다.포인터 변수에 대해 동작하며, 이 값을 반환됩니다.l-value포인터 주소의 값과 동일합니다.이것을 포인터 「참조 해제」라고 부릅니다.예를 들어 C 코드

 인트 x;  인트 *p;  // * 는 선언에 사용됩니다.           // p는 정수에 대한 포인터입니다. 왜냐하면 (참조 후)           // *p는 정수입니다.  x = 0;  // now x == 0  p = &x;  // x 의 주소를 취득합니다.  // p == &x이므로 *p == 0이므로 *p == x  *p = 1;  // p == & x이므로 x = 1과 동일  // 이제 *p == 1 및 x == 1 

변수에 1 할당x참조 해제 연산자와 변수에 대한 포인터를 사용하여x.

구성.

C 및 C++에서 정의되어 있듯이 단항* 연산자는 여러 개의 참조가 필요한 다중 간접의 경우 구성에 사용할 수 있습니다.포인터는 물론 다른 포인터를 참조할 수 있으며, 이러한 경우 참조 해제 연산자의 여러 애플리케이션이 필요합니다.마찬가지로 Java 도트 연산자는 평가 중에 백그라운드에서 포인터의 상당한 역참조가 필요한 매우 정교한 문장을 형성하는 구성에서 사용할 수 있습니다.

다중 포인터 간접의 기본 예는 C(및 C++)의 주요 함수에 대한 argv 인수입니다.이 인수는 프로토타입에서 다음과 같이 제공됩니다.char **argv호출된 프로그램 실행 파일의 이름과 그에 이은 모든 명령줄 인수는 독립된 문자열로 저장됩니다.에 대한 일련의 포인터char이러한 각 문자열의 첫 번째 문자에 대한 포인터가 포함되어 있으며 포인터 배열은 에 전달됩니다.main로서 기능하다argv논쟁.전달된 배열 자체가 포인터로 "감쇠"하기 때문에argv실제로 에 대한 포인터입니다.char에 대한 포인터 배열의 약자임에도 불구하고char(각각의 포인터는 공식적으로1개씩을 가리키고 있는 동안 배열 내의 포인터).char는, 실제로 문자열이 무엇인가를 나타내고 있습니다).부수되는 것main논쟁,argc는 배열의 크기(즉, 배열 요소가 가리키는 문자열 수)를 나타냅니다.그 이외의 경우, (가장 큰) 배열의 크기가 함수에 전달되어 포인터로 변환되면 손실됩니다.따라서,argv에 대한 포인터 배열의 0번째 요소에 대한 포인터입니다.char,*argv이 포인터는 에 대한 포인터입니다.**argv, 문자(규칙상으로는 첫 번째 인수 문자열의 0번째 문자)

기타 구문

C의 조상인 BCPL에서는 등가 연산자가 느낌표를 사용하여 표시되었습니다.

C에서 구조물(또는 결합)의 주소s다음과 같이 표시됩니다.&s. 오퍼레이터 주소&역참조 연산자의 역수입니다.*,그렇게*&s와 동등하다s구조물(또는 유니언)의 주소s포인터에 할당될 수 있습니다.p:

 p = &s; // 의 주소가 p;p == &s; 에 할당되었습니다.  // *p는 s에 해당합니다. 

멤버의 값a구조의s다음과 같이 표시됩니다.s.a. 포인터가 주어졌다.p로.s(즉,p == &s),s.a와 동등하다(*p).a, 줄임말로도 합니다.p->a이것은 포인터를 통해 구조물(또는 결합체)의 구성원에 접근하기 위한 구문 설탕입니다.

 p = &s; // 의 주소가 p;p == &s; 에 할당되었습니다.  // s.a는 (*p.a)에 해당합니다.  // s.a는 p->a에 해당합니다.  // (*p).a는 p->a에 해당합니다. 

->예를 들어, 링크된 목록에서는 다음을 참조할 수 있습니다.n->next->next다음 두 번째 노드의 경우(이러한 경우)n->nextnull이 아닙니다).

Unix 쉘 스크립팅 및 Makefiles와 같은 유틸리티에서는 달러 기호는 "입니다.$"는 변수의 이름을 그 내용으로 변환하기 위해 사용되는 참조 해제 연산자로, 변수에 할당할 때 특히 사용되지 않습니다.

Pascal에서 참조 해제 연산자 ^는 포인터를 정의하고 참조 해제하는 역할을 합니다.다음으로 예를 제시하겠습니다.

유형     콤플렉스P = ^TComplex;     (* ComplexP는 포인터 타입*)     TComplex = 기록.         (* TComplex는 레코드 타입*)         ,        : 정수; VAR     콤플렉스 1,                  (*두 포인터의 정의*)          콤플렉스2: 콤플렉스P;     복잡한 : TComplex;         (* 레코드의 정의*)  시작한다.      복잡한. := 3.14159267;          복잡한. := 1.5;                 신규(콤플렉스 1);                     콤플렉스 1^. := 복잡한.;        콤플렉스 1^. := 3.5;               신규(콤플렉스2);                     콤플렉스2^ := 복잡한;         끝.. 

위의 예에 대하여

  • 2행에서는 디레퍼런스 연산자 ^를 사용하여 포인터 유형을 정의합니다.Complex P.
  • 12행과 13행에서는 Complex 레코드의 Re 필드와 Im 필드에 값이 할당되어 있습니다.
  • 14행에서는 Complex1이 가리키는 TComplex 레코드에 공간이 할당됩니다(New는 C의 malloc() 함수와 동등한 Pascal).
  • 회선 15에서는 디레퍼런스 연산자^를 사용하여 Record Complex의 Re 필드의 값을 Complex1가리키는TComplex 레코드의 Re 필드에 복사합니다.
  • 16행에서는 디레퍼런스 연산자 ^를 사용하여 Complex1가리키는TComplex 레코드의 Im 필드에 값을 할당합니다.
  • 17행에는 Complex2가 가리키는TComplex 레코드에 공간이 할당되어 있습니다.
  • Line 18에서는 Complex 레코드 전체Complex2가 가리키는TComplex 레코드에 복사됩니다.

다양한 언어에서 접두사는 기호로 알려진 식별자에 사용됩니다.이들은 단항 연산자가 아니다 – 구문적으로는 식별자의 일부이며, 식별자의 데이터 유형을 나타내는 것과 같은 다른 의미론을 가지고 있다 – 그러나 구문적으로는 참조 해제 연산자와 유사하며, 이와 혼동될 수 있다.예를 들어 셸 스크립트에서$FOO참조 해제 연산자입니다.$변수에 적용됨FOO(Perl의 경우$foo라고 하는 스칼라 변수입니다.fooPHP에서 FOO는 상수(사용자 정의 또는 빌트인), $FOO는 FOO라는 변수, $FOO는 FOO라는 변수에 이름이 저장되는 변수입니다.

「 」를 참조해 주세요.