有以下挑战:在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、浮动、双等。怎么可能实现这样的函数呢?
此函数声明
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问题