这些数组在C指针表示法中发生了什么?

yot*_*moo 1 c pointers

我对指针数组有点困惑,我只是想确保我是对的.

当我写int *arr它时,它只是一个指向int变量的指针,而不是一个数组.只是我初始化它(比如说malloc)它变成了一个数组.我到目前为止对吗?

另外我还有另外一个问题:给了(在学校里)一个小功能,应该返回一系列成绩,第一个单元格是平均值.这个功能是刻意错误的:他们所做的就是设定

int *grades = getAllGrades();
Run Code Online (Sandbox Code Playgroud)

而且他们已经将指针减少了一个用于普通'细胞'

*(grades - 1) = getAverage();
 return *(grades - 1)
Run Code Online (Sandbox Code Playgroud)

我知道这是错误的,因为返回的值不是数组,我只是不知道如何解释它.当我设置指针时,机器/编译器如何知道我是否只需要指针或数组?

(如果我不清楚它,因为我试图询问一些对我来说仍然含糊不清的事情,我道歉)

Owe*_*wen 5

机器/编译器如何知道我是否只需要指针或数组?

它没有,它永远不会.假设你

int *a = malloc(3 * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

你只需要分配12个字节(假设int是4).但malloc只能看到12.这是一个大对象还是很多小对象?它不知道.真正知道的唯一一个是你;)

现在谈谈你的具体例子,

int *grades = getAllGrades();
Run Code Online (Sandbox Code Playgroud)

在这一点上,正如你所说,没有什么可以说是否grades指向一个数组.但是知道它指向一个数组,这才是最重要的.或者,也许你知道它并没有指向数组.关键是你必须知道它是getAllGrades做什么的,要知道它是返回一个数组还是指向一个东西的指针.

*(grades - 1) = getAverage();
return *(grades - 1)
Run Code Online (Sandbox Code Playgroud)

这不一定是错的,但它确实看起来像草图.如果它是一个数组,你会期望grades[0]== *(grade + 0)成为第一个元素,所以grades[-1]== *(grades - 1)看起来就像它在第一个元素之前.再次,它不一定是错的; 也许getAllGrades他们做了:

int* getAllGrades() {
    int *grades = malloc(sizeof(int) * 10);
    return grades + 1;
}
Run Code Online (Sandbox Code Playgroud)

也就是说,它们的起始点是1.它已经发生了(看看C中的数字食谱),但它有点奇怪.