首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >用c语言从数组语法中计算地址

用c语言从数组语法中计算地址
EN

Stack Overflow用户
提问于 2014-03-19 18:06:26
回答 4查看 643关注 0票数 0

我知道标题一点也不清楚,但是我使用这段代码来告诉我想要问的内容,假设下面是简单的代码:

代码语言:javascript
复制
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,因为我们需要显示它上的值,而不是地址?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 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

代码语言:javascript
复制
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

票数 0
EN

Stack Overflow用户

发布于 2014-03-19 18:08:39

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

票数 2
EN

Stack Overflow用户

发布于 2014-03-19 18:10:44

不,当使用[]'s时,它会自动这样做。另外,取消引用(比如array1 )也是没有意义的,因为指针指向第一个索引(0)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22514506

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档