为什么C中指向数组第0个索引的指针的值与实际数组第0个索引不同?

问题描述 投票:0回答:1

这里是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]?

arrays c function pointers array-pointer
1个回答
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)
© www.soinside.com 2019 - 2024. All rights reserved.