c - 指针数组

标签 c arrays pointers

考虑以下代码:

#include <stdio.h>

int main()
{
  static int a[]={0,1,2,3,4};
  int *p[]={a,a+1,a+2,a+3};            /* clear up to this extent */
  printf(("%u\n%u\n%u",p,*p,*(*p)));   /* how does this statement work? */
  return 0;
}

还有,是否需要通过%u获取地址的值,或者我们也可以使用%d

最佳答案

好的,您已经创建了一个整数数组并用从 0 到 4 的整数填充它。然后您创建了一个包含 4 个元素的整数指针数组,并对其进行了初始化,使其四个元素指向 的前四个元素A。到目前为止,还不错。

那么printf就很奇怪了。 printf 被传递了一个参数,即 ("%u\n%u\n%u",p,p,(*p))。这是一个逗号表达式,这意味着逗号分隔的表达式将依次计算,只返回最后一个。因为第一件事是文字,而不是表达式,所以我希望它会产生错误。但是,如果没有多余的括号,您将:

printf("%u\n%u\n%u\n",p, *p, *(*p));

这是合法的。三个值被传递给 printf,被解释为无符号整数(这实际上只适用于某些系统,因为在前两种情况下您实际传递的是指针,并且它们不能保证与无符号整数的大小相同)并打印出来。

这些值是 p、*p 和 **p。 p是一个数组,p的值就是数组的地址。 *p是p指向的,也就是数组的值。 *p 是第一个值,*(p+1) 是第二个值,等等。现在 *p 是存储在 p[0] 中的值,它是 a[0] 的地址,所以打印另一个地址。第三个参数是 **p 是存储在 (*p) 的值,或者 a[0],即 0

关于c - 指针数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5639166/

相关文章:

java - 对子列表进行排序,Java

c - 使用带可变参数的函数打印字符串 (va_list)

c - 哈希表实现访问错误

c - 打开和关闭大量文件时打开的文件过多

arrays - 在 MATLAB 中创建一个充满一个数字的数组的优雅方法?

javascript - 从数组中获取所有单个单词

c++ - 递归互斥锁背后的想法

c - 迭代c中通过引用传递的数组

c++ - 如何在 <T> 容器上使用 std::sample 返回指针 <T*> 的容器?

c++ - “is not required” ==未定义行为?