참조 해제 연산자
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->next
null이 아닙니다).
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
라고 하는 스칼라 변수입니다.foo
PHP에서 FOO는 상수(사용자 정의 또는 빌트인), $FOO는 FOO라는 변수, $FOO는 FOO라는 변수에 이름이 저장되는 변수입니다.