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