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