我目前正在尝试使用 C 循环的有趣方式。
我在本地声明了一个数组,并使用指向地址 &array for 循环的指针将其打印出来。
我尝试了两种不同的方法:
- 在同一范围内将数组传递给此 for。
- 按值将数组传递给要循环的函数。
输出应该是相同的,但后者似乎多打印了 4 个 value:address 元素超出数组的范围。
注意:不,这不是“行业”标准的做事方式,我只是对这里的内存访问感到好奇。
第一种方法:
int main()
{
int T[] = {1, 2, 3, 8}; // declare and init.
for(int * p = T; p < *(&T+1); p++)
{
printf("%d \t: %x\n", *p, p);
}
}
输出:
1 : eda32920
2 : eda32924
3 : eda32928
8 : eda3292c
第二种方法:(与预期不同的输出)
void loop(int T[])
{
for(int * p = T; p < *(&T+1); p++)
{
printf("%d \t: %x\n", *p, p);
}
}
int main()
{
int T[] = {1, 2, 3, 8}; // declare and init.
loop(T);
}
输出:
1 : e3929920
2 : e3929924
3 : e3929928
8 : e392992c
-476931752 : e3929930
32766 : e3929934
-1358561188 : e3929938
2041695417 : e392993c
passing 如何以及为什么会影响这个 for 循环的条件语句,并打印出正好多出 4 个元素?
最佳答案
在将数组传递给函数的第二个代码片段中,您处理的是指针而不是数组,因为当按值传递数组时,它会隐式转换为指向其第一个元素的指针。并且编译器将具有数组类型的参数调整为指向元素类型的指针。
所以函数声明实际上看起来是这样的
void loop(int *T )
{
for(int * p = T; p < *(&T+1); p++)
{
printf("%d \t: %x\n", *p, p);
}
}
因此,由于 sizeof( int * )
等于 4 或 8(取决于使用的系统),则表达式
*(&T+1)
不指向表达式&T
指向的数组的最后一个元素之后的内存。
关于c - 如何在C中使用数组地址参数按值函数循环传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57410292/