这里是Python程序员。我只了解 C 的基础知识,但我的任务是在数组中获取 n 个条目,然后创建一个以数组指针作为参数的函数,然后访问指针指向的数组元素。
我的初始代码的简化版本如下:
#include<stdio.h>
void func(int *pArr, int size){
for (int j = 0; j < size; j++){
printf("%d ",*(pArr+j));
}
}
int main(){
int n;
printf("Enter the number of elements you want in your list: ");
scanf("%d", &n);
int a[n];
for (int i = 1; i <= n; i++){
printf("Enter element no.%d: ", i);
scanf("%d", &a[i]);
}
func(&a[0], n);
return 0;
}
我的思考过程是,由于 pArr 指向 a 的第 0 个索引,因此当 j = 0 时 *(pArr+j) 应该返回 *pArr ,它应该只是 a 的第 0 个索引。
但令我惊讶的是,以下是我测试运行时得到的输出,其中 a[5] = {1, 3, 9, 8, 2}
863014944 1 3 8 9
当 j = 0 时,程序打印出 *(pArr+j) 的垃圾值,但此后工作正常。所以我修改了代码,将“j”初始化为 1 而不是 0,并更改了“<" to "<=" and surprisingly the program did run perfectly fine after those changes.
这就是我困惑的地方。
如果我声明一个指针 *pArr 指向数组 a 的第 0 个索引,即 *pArr = &a[0];那么打印 *(pArr+1) 不应该返回第一个索引吗?为什么我的程序返回第 0 个索引?当 pArr 指向 a[0] 时,为什么 *(pArr+0) 不等于 a[0]?
func
是正确的,但您没有正确填充 a
。
将数组索引视为偏移量,也就是说它们距数组开头有多远。
0
。1
。n
元素的数组的最后一个元素的索引/偏移量是 n-1
。这就是您正在构建的:
a
+---+---+---+---+---+
| ? | 1 | 3 | 9 | 8 | 2
+---+---+---+---+---+
a[0]
赋值。更换
for (int i = 1; i <= n; i++) // 1 (inclusive) to n (inclusive)
与
for (int i = 0; i < n; i++) // 0 (inclusive) to n (exclusive)