我不理解使用函数传递的一维数组处理

1 c

我有一个名为record [10]的数组,其类型是表结构 { int, int, long, long,char}

我有一个函数,我想传递这个在循环中调用的数组的地址:

for(i = 0 ; i<10; i++)
{
    // internal resolution will be *(record + i) will fetch an address
    function(record[i]);
}
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么它不起作用.我知道它与基础知识有关.

它开始与之合作

for(i = 0 ; i<10; i++)
{
    // then why do I need to pass this address of address here 
    function(&record[i]); 
}
Run Code Online (Sandbox Code Playgroud)

bta*_*bta 8

*(record + i)事实上并不是一个地址. record是一个地址,所以是(record + i),但是存储在由地址表示的地址*(record + i) (record + i).因此,调用function(record[i])是相同的function(*(record + i)),它将数组元素的传递给函数,而不是指针.

语法&record[i]不是地址的地址.它取的record[i]是一个对象的地址.大括号的优先级高于&符号,因此&record[i]相当于&(record[i]).您可以将其视为扩展到&(*(record + i))然后简化为(record + i).

更新: 要从注释中解决您的问题,如果您自己引用数组的名称,则数组会"衰减"为指针.如果添加方括号[],则会从数组中获取.因此,对于您的示例,假设您有一组结构:

struct A {
    ...
    char abc[10];
    ...
} record[10];
Run Code Online (Sandbox Code Playgroud)

然后,你会有:

  • record[i]-类型的对象struct A从所述record阵列
  • record[i].abc- abc特定record对象内的数组,衰减为指针
  • record[i].abc[k] - 字符串中的特定字符
  • &record[i].abc[0] - 创建指向字符串的指针的一种方法

record[i]->abc您在评论中提到的符号无法使用,因为它record[i]是一个对象而不是指针.

更新2: 关于第二个注释,无论您如何在结构中嵌套数组(以及是直接访问该结构还是通过指针),上述相同的规则都适用.使用arrayname[index]表示法访问数组将为您提供数组中的项目.使用arrayname表示法访问数组(即,单独使用数组名称)将为您提供指向数组中第一个元素的指针.如果您需要有关此现象的更多详细信息,请参阅以下几个链接来解释数组以及它们的名称可以衰减为指针的方式: