当前位置: 首页 > 知识库问答 >
问题:

在C中添加2个空指针数组

桂丰
2023-03-14

有以下挑战:在C中编写多态函数:void*add(void*arr1,void*arr2)

该函数接受2个任意类型的数组,并将其内容添加到第三个数组arr3中,如下所示:

arr3[0]=arr1[0]+arr2[0];
arr3[1]=arr3[1]+arr2[1];
.....
arr3[n]=arr1[n]+arr2[n];

函数必须返回arr3作为结果。

不允许取消引用空指针,我不认为将2个数组(arr1和arr2)转换为char*是一个好的做法,因为内容可能是int、浮动、双等。怎么可能实现这样的函数呢?


共有1个答案

符俊材
2023-03-14

此函数声明

void *add(void *arr1, void *arr2);

不提供所需的信息,例如数组元素的实际类型和数组包含的元素数。

您还需要在某个地方提供一个代码,该代码将执行添加两个数组元素的操作。

您应该更改函数声明,指定与标准C函数参数类似的附加参数qsort,或者所需信息应该存储在函数有权访问的全局变量中的某个位置,

这是一个演示程序。

#include <stdio.h>
#include <stdlib.h>

size_t nmemb;
size_t size;

void ( *operation )( void *, const void *, const void * );

void * add( const void *arr1, const void *arr2 )
{
    void *result = malloc( nmemb * size );
    
    if ( result )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            operation( ( char * )result + i * size, 
                       ( const char * )arr1 + i * size,
                       ( const char * )arr2 + i * size );
        }
    }
    
    return result;
}

void add_int( void * result, const void *operand1, const void *operand2 )
{
    *( int * )result = *( const int * )operand1 + *( const int * )operand2;
}

void add_double( void * result, const void *operand1, const void *operand2 )
{
    *( double * )result = *( const double * )operand1 + *( const double * )operand2;
}

int main(void) 
{
    int arr1[] = { 0, 1, 2, 3, 4 };
    int arr2[] = { 5, 6, 7, 8, 9 };
    
    nmemb = sizeof( arr1 ) / sizeof( *arr1 );
    size = sizeof( int );
    operation = add_int;
    
    int *result1 = add( arr1, arr2 );
    
    if ( result1 )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            printf( "%d ", result1[i] );
        }
        
        putchar( '\n' );
    }
    
    free( result1 );
    
    double arr3[] = { 0.0, 1.1, 2.2, 3.3, 4.4 };
    double arr4[] = { 5.5, 6.6, 7.7, 8.8, 9.9 };
    
    nmemb = sizeof( arr3 ) / sizeof( *arr3 );
    size = sizeof( double );
    operation = add_double;
    
    double *result2 = add( arr3, arr4 );
    
    if ( result2 )
    {
        for ( size_t i = 0; i < nmemb; i++ )
        {
            printf( "%.1f ", result2[i] );
        }
        
        putchar( '\n' );
    }
    
    free( result2 );
    
    return 0;
}

程序输出为

5 7 9 11 13 
5.5 7.7 9.9 12.1 14.3 
 类似资料:
  • C++ 指针 在我们讲解指针数组的概念之前,先让我们来看一个实例,它用到了一个由 3 个整数组成的数组:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; for (int i = 0; i < MAX; i++) { cout << "Va

  • C++ 指针 指针和数组是密切相关的。事实上,指针和数组在很多情况下是可以互换的。例如,一个指向数组开头的指针,可以通过使用指针的算术运算或数组索引来访问数组。请看下面的程序:#include <iostream> using namespace std; const int MAX = 3; int main () { int var[MAX] = {10, 100, 200}; int *pt

  • 问题内容: 我是Java菜鸟。我已经掌握了将C / C ++指针转换为Java引用的概念,并且进展相当顺利。 我打了一段有指针的代码(即* ptr)。我需要取消引用指针并更改其指向的指针的值(即 ptr =&newthing;) 在Java中这似乎要困难得多。是否有人对如何解决此问题有任何想法?快速谷歌搜索什么都没有。 这是C ++中的代码示例。我想在Java中获得类似的工作,但是ptr_to_p

  • C++ 数组 您可以先跳过本章,等了解了 C++ 指针的概念之后,再来学习本章的内容。 如果您对 C++ 指针的概念有所了解,那么就可以开始本章的学习。数组名是一个指向数组中第一个元素的常量指针。因此,在下面的声明中: double balance[50]; balance 是一个指向 &balance[0] 的指针,即数组 balance 的第一个元素的地址。因此,下面的程序片段把 p 赋值

  • 指针变量也是变量,是变量就可以任意赋值,不要越界即可(32位编译器指针大小为4字节,64位编译器指针大小为8字节),但是,任意数值赋值给指针变量没有意义,因为这样的指针就成了野指针,此指针指向的区域是未知(操作系统不允许操作此指针指向的内存区域)。所以,野指针不会直接引发错误,操作野指针指向的内存区域才会出问题。 int a = 100; int *p; p = a; //把a的值赋值给指针变量p

  • 我正在为一个Delphi可执行文件开发一个C++的DLL项目。此可执行文件具有如下结构: 例如: 我试着做了这样的课程: 它给了我这个: 那不是我想要的。 我可以通过使用一个数组来实现我的目标: 但是,我被迫有一个固定的长度,这仍然不是我想要的。 我想了一个肮脏的解决办法: 但要解析、读取和写入它真的很难。 这样的问题有没有干净的解决方案? 顺便说一下,这不是一个XY问题