我需要使用具有以下typedef和方法的库:
typedef short int SomeArray[3];
void method(SomeArray* arr){//doSomething}
在我的主代码中,我有一个大数组,想要一个较小的数组,它的索引值与较大的数组完全相同:
short int var[5] = {0, 1, 2, 4, 5};
我需要一个类型为SomeArray的变量,将其传递给test()方法,其变量[0] = var [1],[1] = var [2],[2] = var [3]。这个:
short int* intf = &var[1];
当通过intf [?]访问它时,给出了我需要的东西。但是如何将其转换为SomeArray类型的变量,使其成为具有3个元素的数组?我尝试了类似的方法
SomeArray* arr = intf;
SomeArray* arr = (SomeArray*)intf;
SomeArray* arr = &var[1];
但是它要么不起作用,要么每个arr元素的元素地址都与较大数组的元素地址(在所需位置)不匹配。
答案 0 :(得分:2)
您可能无法将var[1]
的地址强制转换为具有三个元素的数组的指针类型。严格地说,这可能是非法的,因为我想它违反了严格的别名规则(类型化的对象只能通过兼容类型的表达式来访问),但只有很小的;-) 1 。语义上没有问题,因为在3元素数组中预期的短裤都在那里。严格说来,它可能会在任何地方都可以使用:
$ g++ --version && cat arrpassing.cpp && g++ -Wall -o arrpassing -O3 arrpassing.cpp && ./arrpassing
g++ (GCC) 7.4.0
Copyright (C) 2017 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
#include<iostream>
using namespace std;
typedef short int SomeArray[3];
void method(SomeArray* arr)
{
int i=0;
for(auto el: *arr) cout << "arr[" << i++ << "]: " << el << '\n';
}
int main()
{
short arr5[5] = { 0,1,2,3,4 };
method((SomeArray *)(arr5+1));
return 0;
}
arr[0]: 1
arr[1]: 2
arr[2]: 3
答案 1 :(得分:1)
我需要一个类型为SomeArray的变量,其变量[0] = var [1],[1] = var [2],[2] = var [3]传递给test()方法
但是如何将[更大的数组]转换为
CC_Part Received Status
类型的变量,使其成为具有3个元素的数组?
赞:
SomeArray
但是,如果您始终需要一个子数组(即始终需要连续的元素),则可以通过更改short big_array[] {0, 1, 2, 4, 5};
SomeArray small_array {
big_array[1],
big_array[2],
big_array[3],
};
method(&small_array);
以简单地获取指向数组第一个元素的指针来避免复制:
method
这样,您可以使用任意大小的数组的子数组(只要它具有足够的元素)来调用该函数:
void method2(short arr[3]);
不利的一面是,编译时类型检查不能使我们免于犯错误,而传递太小的数组只会带来不确定的行为。
通过扩展short big_array[] {0, 1, 2, 4, 5};
method2(big_array + 1);
的功能模板,并接受任意的迭代器,可以扩展这个想法,并且可以支持除数组之外的任何其他(可遍历)数据结构。