我知道标题根本不清楚,但我用这段代码告诉我想问的问题 假设以下简单代码:
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],因为我们需要显示*一个点的值,而不是地址?
答案 0 :(得分:2)
简单的规则是 数组不是指针 。当数组名称作为参数传递给函数时,它们被转换为指针(在大多数情况下)到它的第一个元素。
答案 1 :(得分:0)
不使用[]时会自动执行此操作。因为指针指向第一个索引(0),所以取消引用数组[1]等也没有意义。
答案 2 :(得分:0)
当您使用括号时,您隐式处理数组的特定元素,因此您不需要使用*
来设置它的值。
在int *a
中,a
是一个指针。这意味着它拥有int
的内存地址。这可以是单独的int
或int
数组的第一个元素。只有通过指针才能知道。
有几种合成器可用于处理此指针。
通过读取或写入*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 *
。您可以通过语法a
或main
访问a[i]
中数组*(a + i)
中的元素 - 它们与标准中描述的相同。但是,请记住,在使用数组本身(a[i]
中的main
)并使用指向数组中第一个元素的指针时,访问数组元素的方式会有所不同({{1在a[i]
)中。有关详细信息,请查看此处 - Difference between dereferencing pointer and accessing array elements