bN -> Nbbb
通过动态分配的指针数组(这里是项目的一部分)存储和访问不同的-Rental类型结构:
typedef struct Rental {
int nDays;
float kmsDriven;
char carLicensePlate[LICENSE_PLATE_LENGTH+1];
char *clientName;
char chargingCategory;
} Rental;
这是我到目前为止所想到的,但我完全无法理解......所以:
我无法理解int main (){
Rental *rentals;
int max_num;
printf("Give a number of rentals you would like to store and manage: ");
scanf("%d", &max_num);
rentals=(Rentals *)malloc(max_num * (sizeof(Rental)))
如何成为一个数组。我的意思是我不应该至少以这种方式声明它:*rentals
?我知道如果我编译上面的代码,我会看到一个错误...但为什么?
我在Stack Overflow中阅读了很多关于使用双指针(Rental *rentals[];
)执行此操作的帖子,但其他人发布的代码通常很难让我阅读(我不知道)所有功能等。)
假设我有一个对象Rental **rentals;
,它将指向rentals[0]
。如果我想将结构传递给函数,我应该写:
rentals
?
答案 0 :(得分:1)
rentals
是一个指针,而不是一个数组,但它是一个指向max_num
结构块的第一个(第零个)元素的指针,因此它可以被视为一个数组因为你可以使用rentals[n]
来引用数组的n th 元素。
这不是一个问题,因此无法回答。
- 我们说我有一个对象
醇>rentals[0]
,它将指向rentals
。如果我想将结构传递给函数,我应该写:variable=function(*arguments*... , Rental *rentals[0]);
?
rentals[0]
不是指针;它是struct Rental
或Rental
。
如果要将结构传递给函数,请编写:
variable = function(…args…, rentals[0]);
如果要将指向结构的指针传递给函数,请编写:
variable = function(…args…, &rentals[0]);
或:
variable = function(…args…, rentals);
这些将相同的地址传递给函数。
您应该错误地检查对scanf()
的调用以确保您有一个号码,并且您应该错误检查您获得的号码(它应该是严格正数,而不是零或负数),您应该出错检查malloc()
返回的值。
答案 1 :(得分:0)
当你声明一个数组时(例如char buffer[10];
,变量实际上指向那个数组。指针和数组非常接近。实际上当你有一个存储数据数组的指针时(就像您使用malloc
}的情况下,您可以执行pointer[0]
和pointer[1]
之类的操作来获取正确的元素。
使用指针访问元素时,您通常会使用*(pointer +1)
来获取位置1上的元素,这与pointer[1]
完全相同。
如果要在数组中传递struct
,可以按照这样的值给出:
void function(struct mystruct var)
{
//...
}
int main()
{
struct mystruct var;
function(var);
}
或通过引用(传递地址而不是数据 - 如果您的结构体积很大,这是理想的):
void function(struct mystruct *var)
{
//...
}
int main()
{
struct mystruct var;
function(&var);
}
通过使用数组,您可以这样做(仍然通过引用):
void function(struct mystruct *var)
{
//...
}
int main()
{
struct mystruct var[10];
function(&var[0]);
}
使用指针(指向数组):
void function(struct mystruct *var)
{
//...
}
int main()
{
struct mystruct *var;
var = malloc( sizeof(struct mystruct) *10 );
//This will pass the address of the whole array (from position 0)
function(&var);
//This will pass the address of the selected element
function(&var[0]);
}
正如您所看到的,声明一个数组或一个指针几乎是相同的,期望您必须自己初始化指针数组(使用malloc
)以及使用malloc
创建的任何内容也必须自己free
。