我有一个指向指针的指针,因为我无法将动态数组传递给函数。但是,如果我想用预制数据初始化指针到指针,我怎样才能设置它,因为数组的{a,b,c}表示法不适用于指针?
答案 0 :(得分:1)
你可以这样做:
static int row1[] = {1, 2, 3};
static int row2[] = {4, 5, 6, 7};
static int row3[] = {8, 9, 10, 11, 12, 13};
static int *pptr[] = {row1, row2, row3};
此时,pptr
可以分配给int**
:
int **p = pptr;
答案 1 :(得分:0)
[此答案仅在您需要双倍*时才有意义。您的问题被编辑为指向指针的指针 - 如果这是您需要的,则此答案无关紧要。]
您可以这样做:
double fValues[3] = { 1, 2, 3 };
变量fValues已经是一个指针 - 没有[]的数组变量是指向数组第一个元素的指针。这不是动态数组,因此您无需分配/释放其内存。
假设你的双指针函数看起来像这样:
void Func(double* pDbl) {...}
Func(fValues);
答案 2 :(得分:0)
您可以递归地创建小动态数组:
#include <stddef.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
typedef struct
{
int* pValues;
size_t Count;
} List;
const List ListEnd = { NULL, 0 };
List NewList(int Value, List SubList)
{
List l;
l.Count = SubList.Count + 1;
if (SubList.Count == 0)
{
l.pValues = malloc(sizeof(int));
}
else
{
l.pValues = realloc(SubList.pValues, l.Count * sizeof(int));
}
if (l.pValues == NULL)
{
// do proper error handling here
abort();
}
// moving data isn't necessary if the list elements are
// in the reverse order
memmove(&l.pValues[1], &l.pValues[0], SubList.Count * sizeof(int));
l.pValues[0] = Value;
return l;
}
void PrintDynArr(int* pValues, size_t Count)
{
while (Count--)
{
printf("%d\n", *pValues++);
}
}
int main(void)
{
int* p;
PrintDynArr(p = NewList(1,
NewList(2,
NewList(3,
NewList(4, ListEnd)))).pValues,
4);
free(p);
return 0;
}
输出:
1
2
3
4