指向2D数组的指针。为什么这个例子有效?

时间:2010-06-15 00:18:57

标签: c++ c

我有这个代码示例,但我不明白为什么要更改数组里面的值 outputUsingArray()正在更改原始数组。

我原本希望在outputUsingArray()中更改数组的值只能用于数组的本地副本。

为什么不是这样?

然而,这是我想要的行为,但我不明白为什么会这样做。

#include <stdlib.h>
#include <stdio.h>
void outputUsingArray(int array[][4], int n_rows, int n_cols) {
  int i, j;

  printf("Output Using array\n");
  for (i = 0; i < n_rows; i++) {
    for (j = 0; j < n_cols; j++) {
      // Either can be used.
      //printf("%2d ", array[i][j] );
      printf("%2d ", *(*(array+i)+j));
    }
    printf("\n");
  }
  printf("\n");

  array[0][0] = 100;
  array[2][3] = 200;

}

void outputUsingPointer(int (*array)[4], int n_rows, int n_cols) {
  int i, j;

  printf("Output Using Pointer to Array i.e. int (*array)[4]\n");
  for (i = 0; i < n_rows; i++) {
    for (j = 0; j < n_cols; j++) {
      printf("%2d ", *(*(array+i) + j ));
    }
    printf("\n");
  }
  printf("\n");
}

int main() {

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

  outputUsingPointer((int (*)[4])array, 3, 4);

  outputUsingArray(array, 3, 4);

  printf("0,0: %i\n", array[0][0]);
  printf("2,3: %i\n", array[2][3]);

  return 0;
}

4 个答案:

答案 0 :(得分:4)

传递int []实际上是将指针传递给数组的第一个元素 传递int *也是将指针传递给数组的第一个元素。

他们是完全相同的。

由于它们都指向内存的同一部分,因此更改一个将改变另一个。

答案 1 :(得分:0)

C / C ++中的数组不是按值传递的。即,将数组作为参数传递时,不会涉及复制。 ie array只是一个引用传递数组的名称。

答案 2 :(得分:0)

C / C ++中的数组实际上只是指针(数学为你完成)。除非您明确地复制数组的内容,否则传递数组只会传递指向第一个元素的指针。

因此,当您基于该基指针修改数组时,您将修改原始数组内容。

答案 3 :(得分:0)

标题## Hi以下是使用**创建二维数组并更新然后打印的示例

#include&lt;stdio.h&gt;
#include&lt;stdlib.h&gt;

void showArray(double** theArray,int arraySizeX, int arraySizeY){
    int index,index2;

    for(index=0;index&lt;arraySizeX;index++){
        for(index2=0;index2&lt;arraySizeY;index2++){
            printf("The valyee of arr[%d][%d] is %lf  \n",index,index2,theArray[index][index2]);
        }
    }


}

void setArray(double** theArray,int arraySizeX, int arraySizeY){
    int index,index2;

    for(index=0;index&lt;arraySizeX;index++){
        for(index2=0;index2&lt;arraySizeY;index2++){
            theArray[index][index2]=index+index2;
        }
    }


}


void main()
{

    int i, arraySizeX =3,arraySizeY=4;


    double** theArray;
    theArray = (double**) malloc(arraySizeX*sizeof(double*));

    for ( i = 0; i &lt; arraySizeX; i++)  {
        theArray[i] = (double*) malloc(arraySizeY*sizeof(double));
    }


    printf("*****************************\n");
    showArray(theArray, arraySizeX,  arraySizeY);
    printf("*****************************\n");

    setArray(theArray, arraySizeX,  arraySizeY);

    printf("__________________________________\n");
    showArray(theArray, arraySizeX,  arraySizeY);
    printf("__________________________________\n");

    free(theArray);


}

我希望这有帮助,