微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

谁能告诉我如何完成此操作:数组与指针的关系代码

如何解决谁能告诉我如何完成此操作:数组与指针的关系代码

#include<stdio.h>
    
int main(void){
    const int size=5;
    int grades[size]={34,23,67,89,68};
    double sum=0.0;
    double *ptr_to_sum=&sum;
    int i;
    printf("\n my grades are:\n");
    for(i=0;i<size;i++){
        printf("%d\t",grades[i]);}
        printf("\n\n");
        for(i=0;i<size;i++){
            sum+=grades[i];
        }
        printf("my average grade is %.2f\n\n",sum/size);
        printf("\n\n");
        printf("sum is at %p,or %luandis%lf\n",ptr_to_sum,*ptr_to_sum);
        printf("grades are at %lu to %lu\n",grades,grades+5);
    }

即使是一个简单的代码,我也无法弄清楚错误代码是正确的,但我只是不知道为什么会出现这个错误。 请任何人都可以帮助我吗? 经过深思熟虑后,我可以假装这是由于用于求和的数据类型 long 而发生的。

ERROR:pointers.c: In function 'main':
pointers.c:7:5: error: variable-sized object may not be initialized
    7 |     int grades[size]={34,68};
      |     ^~~
pointers.c:7:23: warning: excess elements in array initializer
    7 |     int grades[size]={34,68};
      |                       ^~
pointers.c:7:23: note: (near initialization for 'grades')    
pointers.c:7:26: warning: excess elements in array initializer
    7 |     int grades[size]={34,68};
      |                          ^~
pointers.c:7:26: note: (near initialization for 'grades')    
pointers.c:7:29: warning: excess elements in array initializer
    7 |     int grades[size]={34,68};
      |                             ^~
pointers.c:7:29: note: (near initialization for 'grades')    
pointers.c:7:32: warning: excess elements in array initializer
    7 |     int grades[size]={34,68};
      |                                ^~
pointers.c:7:32: note: (near initialization for 'grades')    
pointers.c:7:35: warning: excess elements in array initializer
    7 |     int grades[size]={34,68};
      |                                   ^~
pointers.c:7:35: note: (near initialization for 'grades') 

解决方法

在 C 中,如果您使用变量作为数组的维度,即使是 const 变量,也会使数组大小可变(在 C++ 中,const 变量不是这种情况).

因为数组是可变大小的(从编译器的角度来看),它不能初始化数组 - 因为它假设它不知道有多少元素,所以它不能生成正确的初始化代码。

恐怕你将不得不在这里求助于宏——如果你想给数组一个大小。或者,您可以省略大小,并允许编译器为您推断大小 - 但这需要您初始化数组的所有元素,如果您给数组一个尺寸。

,

抱怨是你有一个由变量给出的大小(所以它不是常数)和一个初始化列表。这里:

const int size=5;
int grades[size]={34,23,67,89,68};

试试这个:

int grades[] = {34,68};

如果您确实需要将大小作为变量/常量,则以下任一方法都可以:

#define NUM_GRADES 5
int grades[] = {34,68};

...

for(i=0;i<NUM_GRADES;i++){

-- 或 --

int grades[] = {34,68};
int size = sizeof grades / sizeof grades[0];
,

来自 C 标准(6.7.6.2 数组声明符):

  1. ... 如果大小是整数常量表达式,元素类型 具有已知的常量大小,数组类型不是 变长数组类型;否则,数组类型是一个变量 长度数组类型。

和(6.6 常量表达式)

6 整数常量表达式应具有整数类型并且应 只有整数常量、枚举常量的操作数, 字符常量,结果为整数的 sizeof 表达式 常量和作为直接操作数的浮点常量 铸件。整数常量表达式中的强制转换运算符只能 将算术类型转换为整数类型,除非作为 操作数到 sizeof 运算符。

在这些声明中

const int size=5;
int grades[size]={34,68};

变量 size 不是整数常量表达式。因此数组 grades 是一个可变长度数组。并根据 C 标准(6.7.9 初始化)

3 要初始化的实体的类型应该是一个数组 未知大小或完整的对象类型不是可变长度 数组类型

所以当数组 grades 被声明为可变长度数组时,您可以对其进行初始化。

您可以使用整数常量表达式代替常量变量 size,例如枚举常量:

enum {  size = 5 };
int grades[size]={34,68};

请注意这一点,因为您在此语句中已经有了整数常量 size then 而不是幻数 5

printf("grades are at %lu to %lu\n",grades,grades+5);

最好写

printf( "grades are at %p to %p\n",( void * )grades,( void * )( grades + size ) );

要输出指针,您必须使用转换说明符 %p

另一种方法是声明数组 grades 而不指定元素数量。例如

int grades[] = { 34,68 };

然后声明一个变量来存储数组中元素的数量,如

const size_t size = sizeof( grades ) / sizeof( *grades );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。