从c中的数组语法计算地址

时间:2014-03-19 18:06:27

标签: c arrays pointers

我知道标题根本不清楚,但我用这段代码告诉我想问的问题 假设以下简单代码:

void example(int *a)
{
    for(i = 0 ; i < 20 ; i++)
    {
       printf(" %d number is %d \n " , i , a[i]);
    }
}
int main()
{
    int a[20] ; 
    // assume that the array is filled 
    example(a);
    return 0 ;
}

所以我的问题是,&#39;地址模式&#39;那个c语言跟着,如果我们写一个[i]?如果我们只是遵循指针的规则或指针的语法,我们必须以这种方式写一个* a [i],因为我们需要显示*一个点的值,而不是地址?

4 个答案:

答案 0 :(得分:2)

简单的规则是 数组不是指针 。当数组名称作为参数传递给函数时,它们被转换为指针(在大多数情况下)到它的第一个元素。

答案 1 :(得分:0)

不使用[]时会自动执行此操作。因为指针指向第一个索引(0),所以取消引用数组[1]等也没有意义。

答案 2 :(得分:0)

当您使用括号时,您隐式处理数组的特定元素,因此您不需要使用*来设置它的值。

int *a中,a是一个指针。这意味着它拥有int的内存地址。这可以是单独的intint数组的第一个元素。只有通过指针才能知道。

有几种合成器可用于处理此指针。

通过读取或写入*a,您正在处理指针指向的int变量。它也可以通过阅读或写入a[0]来完成,两者都意味着完全相同的事情。

假设a指向一系列int变量,使用a[1]可让您处理int旁边存储的a[0]。内部使用的指针类型确定在内存中应该有多少字节。{1}}。接下来会是int个字节,或sizeof(*a)

您也可以使用sizeof(int)代替a[1]。这意味着同样的事情。使用指针进行此类算术运算是可能的,但请注意编译器会在内部自动将*(a + 1)乘以1,因此在通知存储在那里的变量类型时,您不需要冗余。

答案 3 :(得分:0)

关于数组下标运算符[],C99标准§6.5.2.1¶2说 -

  

后缀表达式后跟方括号[]中的表达式   是数组对象元素的下标。该   下标运算符[]的定义是E1 [E2]与...相同   (*((E1)+(E2)))。由于适用于的转换规则   binary +运算符,如果E1是数组对象(等效于指针   到数组对象的初始元素),E2是一个整数,   E1 [E2]表示E1的第E2个元素(从零开始计数)。

因此a[i]函数中的example评估为*(a + i)。你可以用任何一种方式写它。请注意,数组和指针是不同的类型。数组不是C中的第一类对象,不像整数,浮点数,结构等。这意味着你不能将数组传递给函数或从函数返回数组。

在函数main中,a是一种数组类型 - 其类型为int[20],即20整数数组。将a传递给语句

中的函数example
example(a);

main中,数组a计算指向其第一个元素的指针,该元素分配给类型为a的函数参数int *。您可以通过语法amain访问a[i]中数组*(a + i)中的元素 - 它们与标准中描述的相同。但是,请记住,在使用数组本身(a[i]中的main)并使用指向数组中第一个元素的指针时,访问数组元素的方式会有所不同({{1在a[i])中。有关详细信息,请查看此处 - Difference between dereferencing pointer and accessing array elements