Вы должны точно знать , что ожидаемая функция C++.
В C (и C++) все эти функции сигнатур для всех намерений и целей, точно так же:
void foo(float *x , float *y ) ;
void foo(float *x , float y[]) ;
void foo(float x[] , float *y ) ;
void foo(float x[] , float y[]) ;
Все они принимают 2 аргумента, каждый из которых содержит указатель на (содержит адрес) переменной типа float
.И все эти выражения являются абсолютно идентичными в C/C++:
float x[] ;
float *y ;
float r1 = *(x+37) ; // all evaluate to the zero-relative
float r2 = x[37] ; // 37th element of the array.
float r3 = *(y+37) ;
float r4 = y[37] ;
- Выражение
*x
говорит, «Принеси float
(4 байта), расположенные по адресу, указанному в x
- Выражение
*(x+n)
,. где n
- целочисленное значение, говорит: «Возьмите адрес, содержащийся в x, и к этому добавьте смещение в байтах, полученное выражением sizeof(float) * n
. Извлеките значение float
, расположенное по результирующему адресу.
- Массивное выражение
x[n]
в точности эквивалентно выражению указателя *(x+n)
.
И поскольку массивы в C/C++ не имеют связанных метаданных, описывающих их размер, вам нужно точно знать, что ожидает функция.
Обычно один передает указатель (вызов по ссылке) для того, чтобы звонящий разыменовываются точку и установить значение для вас — эквивалент C# 's ref
и out
ключевые слова:
float x ;
float y ;
Foo(ref x , ref y) ; // the callee MAY, but is not REQUIRED to set a value before returning to the caller.
Bar(out x , out y) ; // the callee MUST set a value before returning to the caller.
идиома ваша функция используется всегда используется для поиска массива, хотя обычно, один проходит также размер:
void foo(float *array , int array_length) ;
Хотя это не необычно, если функция ожидает массив быть список не- зе ro, чтобы быть чем-то вроде строки C-style, NUL-terminated. Учитывая сигнатура функции, например:
float compute_mean(float *Xs) ;
Это не редкость для того, чтобы быть как ожидается, будет вызван следующим образом:
float Xs[] = { 3.0 , 2.5 , 9.8 , 7,5 , 0 , } ;
float mean = compute_mean(Xs) ;
и определение быть что-то вроде:
float compute_mean(float *Xs)
{
float n = 0.0 ;
float sum = 0.0 ;
float mean ;
while (*p)
{
++n ;
sum += *p++ ;
}
mean = n > 0 ? sum/n : 0.0 ;
return mean ;
}
Поэтому вам нужно знать семантику метода, который вы вызываете.
Надеюсь, это поможет.
Я смущен - почему вы использовали тег [tag: C#]? Вы имели в виду использовать [tag: C++]? – Oded
Возможный дубликат http://stackoverflow.com/questions/2546706/pointers-in-c-sharp-to-make-int-array –
Это C++-библиотека, импортированная в C# – user1395152