c - 如何在C中使用数组地址参数按值函数循环传递

标签 c arrays

我目前正在尝试使用 C 循环的有趣方式。

我在本地声明了一个数组,并使用指向地址 &array for 循环的指针将其打印出来。

我尝试了两种不同的方法:

  1. 在同一范围内将数组传递给此 for。
  2. 按值将数组传递给要循环的函数。

输出应该是相同的,但后者似乎多打印了 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/

相关文章:

java - 如何使用数组将 csv 转换为 json

java - 数组不会通过 for 循环到达下一个位置

javascript - 关联数组/对象 - 使用点符号获取值

c - Linux Kernel中读写原子操作的实现

C 打印数组的元素

c - 空数组,C 中的动态大小变量

android - 用 numpy 保存二进制文件以供读取的最安全方法

c++ - 跨多个 C++ 项目的编译时配置

c - C 语言字数统计?

c++ - 获取 char 数组的一部分