You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用指针变量打印double浮点数组?求助解决代码问题

问题解决:指针打印double数组及代码修复

首先明确:你注释里的指针打印double数组逻辑本身没问题,但代码存在致命前置错误导致功能失效,同时内积计算也有bug,下面逐一修复:

1. 最核心错误:变长数组声明时机错误

你在main里先声明了y[n]和z[n],但此时n还未通过scanf赋值,属于未初始化的垃圾值,这会导致数组大小非法,后续所有数组读写(包括指针遍历)都是未定义行为。

修复方法:把数组声明移到scanf("%d", &n);之后:

int main(void){
  int n, p;
  double *e; // 先仅声明指针
  
  printf("输入数组长度:\n");
  scanf("%d", &n);

  double y[n],z[n]; // n已赋值,再声明合法的变长数组
  // ... 后续代码不变
}

2. 指针打印double数组的正确写法

修正数组声明后,你注释里的遍历逻辑就能正常工作,整理成可用版本:

// 写法1:用&y[0]作为起始指针
printf("你输入的第一个数组是:");
for(e = &y[0]; e < &y[n]; e++){
  printf(" %lf", *e);
}
printf("\n");

// 写法2:直接用数组名(数组名等价于首元素指针)
printf("你输入的第二个数组是:\n");
for(e = z; e < z + n; e++){
  printf("%lf\n", *e);
}

和int数组的指针遍历逻辑完全一致,唯一区别是格式符用%lf(对应double类型),而int用%d。

3. 内积函数的两个bug修复

  • sum未初始化:double sum;需改为double sum = 0.0;,否则sum初始为垃圾值,计算结果完全错误。
  • 循环条件错误:pointerb < a + len 应改为pointerb < b + len,或者更简洁的方式——只判断pointera的范围即可(两个数组长度相同,同步遍历):
for(pointera = a, pointerb = b; pointera < a + len; pointera++, pointerb++){
  sum += *pointera * *pointerb;
  printf("当前位置乘积:%lf,累计和:%lf\n", *pointera * *pointerb, sum);
}

完整修复后的代码

#include <stdio.h>

double inner_product(const double *a, const double *b, int n);

int main(void){
  int n, p;
  double *e;
  
  printf("输入数组长度:\n");
  scanf("%d", &n);

  double y[n],z[n];
  
  printf("输入第一个数组:\n");
  for(p = 0; p < n; p++){
    scanf("%lf", &y[p]);
  }

  // 指针方式打印第一个数组
  printf("你输入的第一个数组是:");
  for(e = &y[0]; e < &y[n]; e++){
    printf(" %lf", *e);
  }
  printf("\n");

  printf("\n输入第二个数组:\n");
  for(p = 0; p < n; p++){
    scanf("%lf", &z[p]);
  }

  // 指针方式打印第二个数组
  printf("你输入的第二个数组是:\n");
  for(e = z; e < z + n; e++){
    printf("%lf\n", *e);
  }

  printf("\n内积结果是:%lf \n", inner_product(y,z,n));

  return 0;
}


double inner_product(const double *a, const double *b, int len){
  const double *pointera, *pointerb;
  double sum = 0.0; // 初始化sum为0
  for(pointera = a, pointerb = b; pointera < a + len; pointera++, pointerb++){
    sum += *pointera * *pointerb;
    printf("当前位置乘积:%lf,累计和:%lf\n", *pointera * *pointerb, sum);
  }
  return sum;
}

额外说明

你提到用float替换n出现错误,这是因为数组长度必须是整数类型(int),float类型无法用来指定数组大小,这个尝试本身不合法。

内容的提问来源于stack exchange,提问作者KwesiM

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 21:10:28