我知道标题一点也不清楚,但是我使用这段代码来告诉我想要问的内容,假设下面是简单的代码:
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 ;
}所以我的问题是,如果我们写ai,c语言遵循的“寻址模式”是什么?如果我们只是遵循指针的规则或指针的语法,我们必须这样写*ai,因为我们需要显示它上的值,而不是地址?
发布于 2014-03-19 18:38:39
关于数组下标运算符[],C99标准§6.5.2.1第2节说-
后缀表达式后面跟着方括号[]中的表达式是数组对象元素的下标指定。下标运算符[]的定义是E1E2与(*((E1)+(E2))相同)。由于应用于二进制+运算符的转换规则,如果E1是数组对象(等价地,指向数组对象的初始元素的指针),而E2是整数,则E1E2指定E1的第E2元素(从零计数)。
因此,函数a[i]中的example计算结果为*(a + i)。你可以用任何一种方式写。请注意数组和指针是不同的类型。数组不是C中的第一类对象,与整数、浮点数、结构等不同。这意味着不能将数组传递给函数或从函数返回数组。
在函数main中,a是数组类型--它的类型是int[20],即20整数数组。将a传递给语句中的函数example时
example(a);在main中,数组a计算为指向其第一个元素的指针,该指针被赋值给int *类型的函数参数a。您可以通过语法-- a或*(a + i) --访问main中的数组a[i]中的元素,这些元素与标准中描述的等价。但是,请记住,在使用数组本身(a[i]在main中)和使用指向数组中第一个元素的指针(example中的a[i])时,访问数组元素的方式有所不同。有关更多细节,请看这里- Difference between dereferencing pointer and accessing array elements
发布于 2014-03-19 18:08:39
简单的规则是,数组不是指针。数组名称在作为参数传递给函数时被转换为指向其第一个元素的指针(在大多数情况下)。
发布于 2014-03-19 18:10:44
不,当使用[]'s时,它会自动这样做。另外,取消引用(比如array1 )也是没有意义的,因为指针指向第一个索引(0)。
https://stackoverflow.com/questions/22514506
复制相似问题