4

C関数に渡されたときの&array [0]と&arrayの間に違いはありますか?この配列はvoid*配列であり、現在データとして整数を取ります。

テストコードを追加しました

#include <iostream>
#include <conio.h>

using namespace std;

int read_buffer[10] = {0,0,0,0,0,0,0,0,0,0};

int write_buffer[10] = {0,1,2,3,4,5,6,7,8,9};

void WriteBlock(void* SrcPtr)
{
  //WriteBlock will use SrcPtr and store the data to a common memory block which ReadBlock will access.
 }

void ReadBlock(void* DstPtr)
{
   //ReadBlock function will fetch data from readBuffer and put the data back into the *DstPtr.
}

void main()
{
 WriteBlock((int*)&write_buffer);
 //Is there a difference between these two below calls.
  ReadBlock(&read_buffer[0]);
  ReadBlock(&read_buffer);
 }
4

5 に答える 5

6

はい、大きな違いがあり、文脈によって異なります。

このことを考慮:-

char arrayA[10];
char *arrayB;

&arrayA[0]&arrayB[0]どちらも type を持っていますchar *

しかし&arrayA、型char (*)[10]がありますが、&arrayB型がchar **あります-ポインターのアドレス。

の場合arrayA、これらは同じアドレスを指していますがarrayB、 の場合はそうではありません! 「ポインターと配列は同じ」というよくある C の誤解があります。これは、彼らが絶対的ではないという素晴らしい例です。

これを参照してください: http://ideone.com/OcbuXZ

于 2013-02-19T10:56:28.563 に答える
2

array宣言されていると仮定します

void *array[N];

&array[0]&arrayは同じを生成します(配列の最初の要素のアドレスは配列自体のアドレスと同じです) が、型が異なります

Expression        Type
----------        ----
    &array        void *(*)[10]  -- pointer to 10-element array of `void *`
  &array[0]       void **        -- pointer to pointer to void

関数プロトタイプは、渡す式と一致する必要があります。関数を次のように呼び出す場合

func(&array);

関数プロトタイプは

void func(void *(*arrp)[10]) {...}

関数を次のように呼び出す場合

func(&array[0]);

関数プロトタイプは

void func(void **arrp) {...}

ただし、その場合、配列のサイズを別のパラメーターとして渡す必要があります。

array今、宣言されていると仮定します

void **array = malloc(sizeof *array * N);

次に、式&array&array[0]は異なる値異なる型を生成します。

Expression        Type
----------        ----
    &array        void ***  
 &array[0]        void **   

&arrayarray配列に割り当てられたヒープメモリのアドレスとは異なる、変数自体のアドレスが表示されます。繰り返しますが、関数のプロトタイプは、使用する式の型と一致する必要があります。

于 2013-02-19T12:08:36.667 に答える
0

arrayが本当に配列の場合、

  • &array[0]の要素 0 へのポインタです。array[]
  • &array全体へのポインタですarray[]

したがって、これら 2 つの式は異なるタイプです。そして、これが主な違いであり、2 つのうち間違ったものを渡すと、コードがコンパイルに失敗する可能性があります。

ただし、低レベルでは、2 つのポインターは同じアドレスを保持します。

于 2013-02-19T11:35:04.720 に答える
0

はい、大きな違いがあります

&array[0]==>void** 

&array==>void***
于 2013-02-19T11:36:27.083 に答える
0

これはコンパイルされません。a を使用していてvoid *、その最初の要素を取得しようとしています。しかし、それはどのくらいのサイズを持っていますか?コンパイラは知りません。int *次のようなことを試みていない場合、使用するとコンパイルされる可能性があります。

int main (void) {
  int *arr = malloc( 10 );

  arr = &arr[0]; // this is ok
  arr = &arr;    // wrong data type
}

&arrayを返し、int **&array[0]返しますint *。これらは異なるデータ型です。

于 2013-02-19T10:58:24.953 に答える