【问题标题】:warning: assignment makes pointer from integer without a cast [-Wint-conversion] p = (i + 1) * 100; [closed]警告:赋值使指针从整数而不进行强制转换 [-Wint-conversion] p = (i + 1) * 100; [关闭]
【发布时间】:2022-01-03 15:37:15
【问题描述】:

我正在尝试用数字填充数组而不使用scanf。我遇到了警告:assignment makes pointer from integer without a cast [-Wint-conversion]

p = (i + 1) * 100;
  ^

当我尝试打印数组时,数组输出随机值。如何解决?

#include<stdio.h>

int main() {
    int nums[8], i;
    int *p;
    p = nums;
    for (int i = 0; i < 8; ++i)
    {
        p = (i + 1) * 100;
        p++;
    }

    return 0;
}

【问题讨论】:

  • *p = (i + 1) * 100;
  • 无论你做什么,不要添加演员表
  • 使用数组语法。 p[i] = (i+1)*100;
  • @Lundin 为什么不nums[i] = ...? ;)
  • @Someprogrammerdude 太简单了,太易读了,我猜。

标签: c pointers compiler-errors type-conversion integer


【解决方案1】:

你声明了一个指针

int *p;
p = nums;

然后不是分配指针指向的数组元素,而是尝试为指针本身分配一个整数值。

p = (i + 1) * 100;

你的意思很明显

*p = (i + 1) * 100;

请注意,在 for 循环中使用幻数 8 是个坏主意。最好使用命名常量。

如果你想在 for 循环中使用指针填充数组,那么程序可以如下所示

#include<stdio.h>

int main( void ) 
{
    enum { N = 8 };

    int nums[N];

    int init_value = 1;
    for ( int *p = nums; p != nums + N; ++p )
    {
        *p = 100 * init_value++;
    }

    return 0;
}

使用这种方法,您可以编写一个单独的函数,该函数将按以下方式初始化数组

void init_array( int *a, size_t n, int value )
{
    for ( int *p = a; p != a + n; ++p )
    {
        *p = 100 * value++;
    }
}

【讨论】:

    【解决方案2】:

    在赋值 p = (i + 1) * 100 中,pint *,而不是 int,因此赋值会将整数 (i + 1) * 100 转换为指针。请改用*p = (i + 1) * 100

    【讨论】:

    • 没有选角。有一个转换,但它是(i + 1) * 100 的结果与p 的类型相匹配的转换(即(i + 1) * 100 的结果被转换为int *),而不是反过来。
    猜你喜欢
    • 1970-01-01
    • 2019-09-17
    • 2019-11-02
    • 2016-05-29
    • 2016-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多