C指针帮助:数组/指针等价

C指针帮助:数组/指针等价,c,arrays,pointers,C,Arrays,Pointers,在此玩具代码示例中: int MAX = 5; void fillArray(int** someArray, int* blah) { int i; for (i=0; i<MAX; i++) (*someArray)[i] = blah[i]; // segfault happens here } int main() { int someArray[MAX]; int blah[] = {1, 2, 3, 4, 5}; fillArray(&

在此玩具代码示例中:

int MAX = 5;

void fillArray(int** someArray, int* blah) {
  int i;
  for (i=0; i<MAX; i++)
    (*someArray)[i] = blah[i];  // segfault happens here
}

int main() {
  int someArray[MAX];
  int blah[] = {1, 2, 3, 4, 5};

  fillArray(&someArray, blah);

  return 0;
}
int MAX=5;
void fillArray(int**someArray,int*blah){
int i;
对于(i=0;i
我想填充数组someArray,并在函数外部保留更改

当数组衰减为指向第一个元素的指针时,只需将数组传递给函数:

void fillArray(int* someArray, int* blah) {
    int i;
    for (i=0; i<MAX; i++)
        someArray[i] = blah[i]; 
}
对元素的更改将在函数外部可见

如果实际代码要在
fillArray()
中分配数组,则需要
int**

void fillArray(int** someArray, int* blah) {
    int i;
    *someArray = malloc(sizeof(int) * MAX);
    if (*someArray)
    {
        for (i=0; i<MAX; i++)  /* or memcpy() instead of loop */
            (*someArray)[i] = blah[i];
    }
}
我想填充数组someArray,并在函数外部保留更改

当数组衰减为指向第一个元素的指针时,只需将数组传递给函数:

void fillArray(int* someArray, int* blah) {
    int i;
    for (i=0; i<MAX; i++)
        someArray[i] = blah[i]; 
}
对元素的更改将在函数外部可见

如果实际代码要在
fillArray()
中分配数组,则需要
int**

void fillArray(int** someArray, int* blah) {
    int i;
    *someArray = malloc(sizeof(int) * MAX);
    if (*someArray)
    {
        for (i=0; i<MAX; i++)  /* or memcpy() instead of loop */
            (*someArray)[i] = blah[i];
    }
}
没有“数组/指针”等价,数组和指针非常不同。千万不要混淆它们。
someArray
是数组。
&someArray
是指向数组的指针,类型为
int(*)[MAX]
。该函数获取指向指针的指针,即
int**
,该指针需要指向内存中的某个指针变量。代码中没有指针变量。它可能指向什么

在某些表达式中,数组值可以隐式降级为其第一个元素的指针右值。需要左值的某些内容(如获取地址(
&
)显然不能以这种方式工作。以下是数组类型和指针类型之间的一些区别:

  • 无法分配或传递数组类型。指针类型可以
  • 指向数组的指针和指向指针的指针是不同的类型
  • 数组数组和指针数组是不同的类型
  • 数组类型的
    sizeof
    是长度乘以组件类型的大小;指针的
    sizeof
    只是一个数组的大小 指针
    • 没有“数组/指针”等价,数组和指针非常不同。千万不要混淆它们。
      someArray
      是数组。
      &someArray
      是指向数组的指针,类型为
      int(*)[MAX]
      。该函数获取指向指针的指针,即
      int**
      ,该指针需要指向内存中的某个指针变量。代码中没有指针变量。它可能指向什么

      在某些表达式中,数组值可以隐式降级为其第一个元素的指针右值。需要左值的某些内容(如获取地址(
      &
      )显然不能以这种方式工作。以下是数组类型和指针类型之间的一些区别:

      • 无法分配或传递数组类型。指针类型可以
      • 指向数组的指针和指向指针的指针是不同的类型
      • 数组数组和指针数组是不同的类型
      • 数组类型的
        sizeof
        是长度乘以组件类型的大小;指针的
        sizeof
        只是一个数组的大小 指针

      当您创建一个数组时,例如int myArray[10][20],保证从堆栈中分配一个连续的内存块,并使用常规数组算法查找数组中的任何给定元素

      如果要从堆中分配该3D“数组”,可以使用malloc()并获取一些内存。该内存是“哑的”。它只是一块内存,应该将其视为一个向量。没有一个带有数组的导航逻辑助理附带此功能,这意味着您必须找到另一种方式来导航所需的3D数组

      由于对malloc()的调用返回一个指针,因此您需要的第一个变量是一个指针,用于保存int*s的向量,您需要保存一些实际的整数数据,即:

      国际*帕雷

      …但这仍然不是您要存储整数的存储。您拥有的是一个指针数组,当前没有指向任何内容。要获取数据的存储,您需要调用malloc()10次,每次调用malloc()为每个调用分配20个整数的空间,其返回指针将存储在指针的*pArray向量中

      整数*帕雷

      需要改成

      内部**帕雷

      正确指示它是指向指针向量基的指针

      第一次解引用,*pArray[i]将您置于int指针数组中的某个位置,第二次解引用,*p[i][j]将您置于int指针数组中的某个位置,由pArray[i]中的int指针指向

      IE:堆中散布着一堆整型向量,由跟踪它们位置的指针数组指向。与堆栈中静态分配的数组[10][20]完全不同,后者都是连续存储,任何地方都没有一个指针

      正如其他人所回避的那样,基于指针的堆方法乍一看似乎没有太多优势,但事实证明它具有极大的优越性

      首先,也是最重要的,您可以使用free()或realloc()可以随时调整堆内存大小,并且在函数返回时不会超出范围。更重要的是,经验丰富的C程序员尽可能将其函数安排在向量上操作,在函数调用中删除1级间接寻址。最后,对于大型数组,相对于可用内存,尤其是大型数组,shar在嵌入式计算机中,大块的连续内存通常不可用,并且对其他需要内存的程序不友好。在堆栈上分配大的静态数组的代码是维护的噩梦

      在这里,您可以看到表只是一个shell,它收集从向量操作返回的向量指针,其中所有有趣的事情都发生在向量级或元素级
      /*-------------------------------------------------------------------------------------*/
      dbl **TblRand(dbl **TblPtr, int rows, int cols)
      {
          int  i=0;
      
          if ( NULL == TblPtr ){
              if (NULL == (TblPtr=(dbl **)calloc(rows, sizeof(dbl*)))) 
                  printf("\nCalloc for pointer array in TblRand failed");
          }
          for (; i!=rows; i++){
              TblPtr[i] = VecRand(NULL, cols);
          }
          return TblPtr;
      }
      /*-------------------------------------------------------------------------------------*/
      
      dbl *VecRand(dbl *VecPtr, int cols)
      {
          if ( NULL == VecPtr ){
              if (NULL == (VecPtr=(dbl *)calloc(cols, sizeof(dbl)))) 
                  printf("\nCalloc for random number vector in VecRand failed");
          }
      
          Randx = GenRand(VecPtr, cols, Randx);
          return VecPtr;
      }
           /*--------------------------------------------------------------------------------------*/
      
      static long GenRand(dbl *VecPtr, int cols, long RandSeed)
      {
          dbl  r=0, Denom=2147483647.0;
      
          while ( cols-- )
          {
              RandSeed= (314159269 * RandSeed) & 0x7FFFFFFF;
              r       = sqrt(-2.0 * log((dbl)(RandSeed/Denom)));
              RandSeed= (314159269 * RandSeed) & 0x7FFFFFFF;
              *VecPtr = r * sin(TWOPI * (dbl)(RandSeed/Denom));
              VecPtr++;
          }
          return RandSeed;
      }