2010-07-13 4 views
12

간단한 질문이지만 DLL 함수를 가져오고 매개 변수는 int *입니다. Method (0)을 입력하려고하면 "int 및 int *를 변환 할 수 없습니다"라는 오류가 발생합니다.DotNet - int * 란 무엇입니까?

그 의미는 무엇입니까?

답변

15

이것은 pointer to an int에 대한 고전적인 C 표기입니다. 유형 뒤에 *이 올 때마다 그 유형에 해당 유형이 pointer임을 나타냅니다. C와 달리 C에서와 달리 포인터를 사용하려면 함수를 unsafe으로 명시 적으로 정의하고 프로젝트 등록 정보에서 unsafe 코드를 활성화해야합니다. 포인터 유형은 또한 구체적인 유형과 직접 교환 할 수 없기 때문에 유형 참조가 먼저 취해 져야합니다. C# (또는 해당 C & C++)에서 int와 같은 다른 유형에 대한 포인터를 얻으려면 포인터를 가져 오려는 변수 앞에 & (앰퍼샌드) 역 참조 연산자를 사용해야합니다.

unsafe 
{ 
    int i = 5; 
    int* p = &i; 
    // Invoke with pointer to i 
    Method(p); 
} 

'안전하지 않은'코드 C#을

아래 안전하지 않은 코드에 몇 가지 주요 기사 및 C#에서 포인터의 사용이다.

+0

여기에 추가하려면'&'는'int i'의 포인터 (주소)를 가져 오는 것입니다. ... – Nate

+0

@ 네이트 : 좋은 점, 역 참조 연산자에 대한 더 나은 설명을 추가하겠습니다. – jrista

+0

여기 같은 의견 : 안전하지 않은 코드와 아무런 관련이 없습니다. 인수는 단순히 참조로 전달됩니다. C#의 "ref"키워드. 그것은 JIT 컴파일러가 완료 될 때까지 C#의 포인터이기도합니다. –

6

그것은 pointer to an int입니다. 일반적으로 관리되는 코드는 피해야합니다. 가져온 메소드 선언을 게시 할 수 있습니다. IntPtr은 일반적으로 이러한 종류의 interop에 충분합니다.

+1

이것은 참조로 전달 된 인수 일뿐입니다. IntPtr을 사용하는 것은 P/Invoke 마샬 러가 잘 지원합니다. –

+2

무엇을하는지에 따라 다릅니다. 그것이 배열이라면, int []는 당신이 원하는 것이다. 만약 핸들이라면, 보통 'IntPtr'이 가장 좋습니다. 특히 0을 전달할 계획이라면 특히 좋습니다. int에 대한 실제 참조를 원한다면'ref int' 나'out int'가 더 잘 작동 할 것입니다. – Blindy

+1

메서드 선언을 보지 않고도 한 방법이나 다른 방법을 추측 할 수 없습니다 (ref vs array vs pointer). @ 블라인디가 돈에 옳다. 호출되는 메서드에 따라 다릅니다. 예를 들어 SendMessage의 LPARAM은 보통 IntPtr로 마샬링되고 그 사람은 일반적으로 메모리 포인터 (int *로 표현 될 수 있음)를 보유합니다. – dkackman

2

사용하는 언어에 따라 다릅니다. C#에서는 "ref"키워드를 사용하여 인수를 선언해야합니다. VB.NET에서는 ByRef 키워드를 사용해야합니다. 변수가 아닌 상수를 전달하여 호출해야합니다. 다음과 같은 것 :

int retval = 0; 
Method(ref retval); 
// Do something with retval 
//... 
+0

ref는 실제로 허용 된 답변에 사용 된 &와 동일합니까? –

+0

지터가 완료된 후 후드 아래에서 그렇습니다. –

+0

그가 사용한 DLL의 작성자가 C#의 서명'Method (int * p)'를 결정한 경우, 그는'Method (ref retval); 구문을 사용하여 메소드를 호출 할 수 없습니다. DLL _could_의 작성자는 서명 대신에'Method (ref int p)'를 선택했으나 어떤 이유로 그것을하지 않았습니다. C#은 "다음 주소"에 대한 증분, 포인터 int * p (예 : C#'p ++'및 "안전하지 않은")를 사용하는 방식과 같이'ref int' 유형의 변수에 "산술"을 제공하지 않습니다 . –

관련 문제