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;
}