让一个数组指向C ++中具有不同界限的另一个数组

时间:2019-03-01 11:35:41

标签: c++ arrays pointers

我需要使用具有以下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元素的元素地址都与较大数组的元素地址(在所需位置)不匹配。

2 个答案:

答案 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 这确实是一个边界问题。显然,您可以通过简单的类型指针来访问数组的各个元素。并且C ++标准在某些情况下将单个对象视为大小为1的数组,因此您可以考虑通过“子数组”(当然是相同元素类型)访问较大数组的内存。 / sub>

答案 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); 的功能模板,并接受任意的迭代器,可以扩展这个想法,并且可以支持除数组之外的任何其他(可遍历)数据结构。