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

返回指针的函数赋值报错:指针类型不兼容问题求助

问题分析与解决

问题描述

尝试运行一个返回指针的函数,在主函数中存储其返回值时出现错误,疑惑是否应该使用指向指针的指针来处理该函数的返回值。

原代码

#include <stdio.h>
#include <wiringPi.h>

int **ptr;
int **ptr1;

int* readfunc (int storage[33]){
     
        storage[0] = digitalRead(D0)+48;
        storage[1] = digitalRead(D1)+48;
        storage[2] = digitalRead(D2)+48;
        storage[3] = digitalRead(D3)+48;
        storage[4] = digitalRead(D4)+48;
        storage[5] = digitalRead(D5)+48;
        storage[6] = digitalRead(D6)+48;
        storage[7] = digitalRead(D7)+48;
        
 return storage;
}

int* readfunc2 (int storage2[33]){

        storage2[0] = digitalRead(D0)+48;
        storage2[1] = digitalRead(D1)+48;
        storage2[2] = digitalRead(D2)+48;
        storage2[3] = digitalRead(D3)+48;
        storage2[4] = digitalRead(D4)+48;
        storage2[5] = digitalRead(D5)+48;
        storage2[6] = digitalRead(D6)+48;
        storage2[7] = digitalRead(D7)+48;
   
 return storage2;
}

int main(){

  ptr = &readfunc2;
  ptr1 = &readfunc;

  return 0;
}

报错信息

assignment to ‘int **’ from incompatible pointer type ‘int * (*)(int *)’ [-Wincompatible-pointer-types]
   44 |   ptr = &readfunc2;

warning: assignment to ‘int **’ from incompatible pointer type ‘int * (*)(int *)’ [-Wincompatible-pointer-types]
   45 |   ptr1 = &readfunc;

问题根源与解决方法

1. 类型不匹配的核心原因

你定义的int **ptr是指向int指针的指针,而&readfunc2是函数指针,类型为int *(*)(int *)(指向返回int*、参数为int数组的函数的指针),两者属于完全不同的类型,因此编译器抛出类型不兼容的警告。

2. 两种正确的处理方式

根据你的需求,分两种情况处理:

情况一:存储函数的地址(使用函数指针)

如果你的目的是保存函数本身的地址(比如后续通过指针调用函数),需要将ptr和ptr1定义为对应的函数指针类型:

// 方法1:先typedef定义函数指针类型,便于复用
typedef int* (*ReadFuncPtr)(int[]);
ReadFuncPtr ptr;
ReadFuncPtr ptr1;

// 方法2:直接定义函数指针
int* (*ptr)(int[]);
int* (*ptr1)(int[]);

赋值时,函数名本身就是地址,无需加&(加了也合法,但通常省略):

ptr = readfunc2;
ptr1 = readfunc;

情况二:存储函数的返回值(即返回的数组指针)

如果你的目的是保存函数返回的int*(也就是传入的数组的地址),需要将ptr和ptr1定义为int*,同时要先创建作为参数的数组(函数内部操作的是你传入的数组):

int main(){
    int storage[33]; // 创建用于存储数据的数组
    int* ptr = readfunc(storage); // 存储函数返回的数组指针
    int* ptr1 = readfunc2(storage);

    // 后续可以通过ptr访问storage数组的内容
    return 0;
}

注意:这里返回的指针指向的是栈上的数组storage,只要main函数未结束,该指针就有效。

3. 额外优化建议

readfunc和readfunc2的逻辑完全重复,可以合并为一个函数,减少冗余代码:

int* readDigitalPins(int storage[33]){
    storage[0] = digitalRead(D0)+48;
    storage[1] = digitalRead(D1)+48;
    storage[2] = digitalRead(D2)+48;
    storage[3] = digitalRead(D3)+48;
    storage[4] = digitalRead(D4)+48;
    storage[5] = digitalRead(D5)+48;
    storage[6] = digitalRead(D6)+48;
    storage[7] = digitalRead(D7)+48;
    return storage;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 20:45:31