Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用c语言中的数组语法计算地址_C_Arrays_Pointers - Fatal编程技术网

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

用c语言中的数组语法计算地址,c,arrays,pointers,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); re

我知道标题一点也不清楚,但我用这个代码告诉你我想问什么 假设以下简单代码:

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 ;
}
void示例(int*a)
{
对于(i=0;i<20;i++)
{
printf(“%d编号为%d\n”,i,a[i]);
}
}
int main()
{
INTA[20];
//假设数组已填充
例(a);
返回0;
}

所以我的问题是,如果我们写一个[i],c语言遵循的“addresing模式”是什么?如果我们只是遵循指针的规则或指针的语法,我们必须这样写*a[i],因为我们需要显示*a点的值,而不是地址

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

否使用[]时,它会自动执行此操作。另外,取消引用say array[1]等等也没有意义,因为指针指向第一个索引(0)。

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

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

有几个synthaxes可用于处理此指针

通过读取或写入
*a
,您正在处理指针指向的
int
变量。也可以通过读取或写入
a[0]
来完成,两者的含义完全相同

假设
a
指向一系列
int
变量,使用
a[1]
可以处理存储在
a[0]
旁边的
int
。指针类型在内部用于确定下一个成功的
int
应该在内存中的字节数。接下来是
sizeof(*a)
bytes,或者
sizeof(int)


除了
a[1]
之外,您还可以使用
*(a+1)
。意思是一样的。这种带指针的算术运算是可能的,但请注意,编译器会在内部自动将
1
乘以
sizeof(int)
,因此在通知存储在那里的变量类型时,您不需要冗余。

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

后缀表达式后跟方括号中的表达式[] 数组对象元素的下标指定。这个 下标运算符[]的定义是E1[E2]与 (*((E1)+(E2)))。因为适用于 二进制+运算符,如果E1是数组对象(相当于指针 ,E2是一个整数, E1[E2]指定E1的第E2个元素(从零开始计数)

因此,函数
示例
中的
a[i]
计算结果为
*(a+i)
。你可以用任何一种方式写。请注意,数组和指针是不同的类型。与整数、浮点数、结构等不同,数组在
C
中不是一级对象。这意味着您不能将数组传递给函数或从函数返回数组

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

example(a);

main
中,数组
a
的计算结果是指向其第一个元素的指针,该元素被分配给类型为
int*
的函数参数
a
。您可以通过语法-
a[i]
*(a+i)
访问
main
中数组
a
中的元素-它们与标准中所述的元素等效。但是,请记住,当使用数组本身(
main
中的
a[i]
)和使用指向数组中第一个元素的指针(
example
中的
a[i]
)时,访问数组元素的方式是不同的。更多细节,请看这里-

“在大多数情况下”:你让我好奇:现在我想不出一个不是这样的例子。你能帮帮我吗?@IngoLeonhardt
sizeof
。是的,但要学究一点,
sizeof
根本不是一个函数。他的意思是
sizeof(数组)
将为您提供数组占用的全部内存空间,而不是指针的大小
sizeof(一些普通指针)
将始终为32位体系结构提供4个字节,为64位体系结构提供8个字节,而不管发生什么。@Havenard;不,这是标准的一部分。在C语言中,没有传递引用。