例如,我有这个声明:
int a[10];
之前我是这样理解的:a
其实是一个指针,它会连续指向内存中的10个元素。
但是今天老师教我的时候说:会是一个指针数组,每个指针都指向它的值。
我不知道哪个是真的。请告诉我。
之前,我是这样理解的:a 实际上是一个指针,它会连续指向内存中的 10 个元素。
这是错误的,它是一个数组。它在内存中有一个特定的位置,可以保存 10 个整数。使用指针可以做到a = &some_int
,但是,这不适用于数组。如果您传递a
给期望指针的函数,它将被衰减(转换为)指针,但这是不同的。
但是,今天,当我的老师教我时,他说:它会有一个指针数组,每个指针都指向它的值。
这也是错误的,它是一个 10 个整数的数组。要拥有 10 个整数指针,您需要将其定义为int *a[10]
. Still 元素不指向它们的值。
你和你的老师都错了。
a
将具有指针的一些特性int
,您可以将其作为指针传递给函数并执行标准指针运算,但它仍然是 C 术语中的数组;例如,您无法更改它(将其视为int * const
)。
但是,您是对的, 的元素a
将作为连续数组放置在内存中,而不是指向随机位置的指针。
我敢打赌你误解了你的老师。
a 实际上是一个指针,它将连续指向内存中的 10 个元素。
这几乎没问题。(在某些情况下,您可以这样想。但它过于简单化了,其他人解释了原因。)
它将是一个指针数组
这是完全错误的。
每个指针都指向它的值。
这是完全错误的。
简单来说,“'a' 是一个在内存中连续保存 10 个元素的变量”,这就是我们将其称为数组的原因。访问变量的元素需要索引。即,要访问变量“a”的第 5 个元素,我们需要指定 a[5]。指定“a”指向连续内存位置的起始地址,指定 a+5 指向从第一个连续内存开始的第 5 个元素。
您可以在此处参考有关数组和指针的一个很好的常见问题解答:http: //c-faq.com/aryptr/index.html。
int a[10];
指在内存中分配的 10 个整数单元。
int *b = a;
等价于int *b = &a[0];
并且意味着 b 指向 a 的第一个单元格。