【问题标题】:Pointing an array in c++?在 C++ 中指向一个数组?
【发布时间】:2016-01-08 03:50:28
【问题描述】:

我想在 c++ 中指向一个数组,可以吗?

我的主要代码:

#include "ArrayPointerClass.h"

#include "stdafx.h"
#include <iostream>
#include <string>

int _tmain(int argc, _TCHAR* argv[])
{
    float arr[2];

    ArrayPointerClass::pointingArray(&arr);

    return 0;
}

ArrayPointerClass.h

#pragma once
static class ArrayPointerClass
{
public:
    ArrayPointerClass();
    ~ArrayPointerClass();
    static void pointingArray(float* arr[2]);
};

ArrayPointerClass.cpp

#include "stdafx.h"
#include "ArrayPointerClass.h"


ArrayPointerClass::ArrayPointerClass()
{
}


ArrayPointerClass::~ArrayPointerClass()
{
}

void ArrayPointerClass::pointingArray(float* arr[2]){

    float newArray[2] = { 2.2f, 2.2f };
    *arr = newArray;

}

我遇到了这个错误: 错误 3 错误 C2653: 'ArrayPointerClass' : 不是类或命名空间名称 c:\users\alex\documents\visual studio 2013\projects\pointerarray\pointerarray\pointerarray.cpp 13 1 PointerArray

错误 3 错误 C3861: 'pointingArray': 找不到标识符 c:\users\alex\documents\visual studio 2013\projects\pointerarray\pointerarray\pointerarray.cpp 13 1 PointerArray

我知道在 C++ 数组中,不允许使用未定义长度的数组。是这个原因吗?

感谢您的支持

【问题讨论】:

  • 如果这是您的意图,您不能分配给 C 数组。 std::array 效果好很多,指针和引用的语法和正常一样。
  • 使用std::vector。这就是它的用途。
  • 此代码的一个问题(当前)未在任何答案中解决是您的第一个错误的来源:您在 stdafx.h 之前包含 ArrayPointerClass.h,预编译头 (PCH)对于 VC++。当它解析 PCH 时,它将跳过包含 stdafx.h 的所有内容,导致您的 ArrayPointerClass.h 标头被跳过而不包括在内,这会生成您在问题中报告的错误。

标签: c++ arrays pointers static


【解决方案1】:

没有办法在 c++ 中创建静态类。 static 关键字可以应用于对象和函数。 每个数组名都是一个指针。因此,不能在参数中给出下标。提供指针类型就足够了。

修改后的代码:

#include <iostream>
#include <string>
using namespace std;


class ArrayPointerClass
{
 public:
 ArrayPointerClass();
 ~ArrayPointerClass();
 static void pointingArray(float* arr);
};

ArrayPointerClass::ArrayPointerClass()
{
}

ArrayPointerClass::~ArrayPointerClass()
{
}

 void ArrayPointerClass::pointingArray(float* arr){

 float newArray[2] = { 2.2f, 2.2f };
 arr = newArray;

}


int main()
{
  float arr[2];

  ArrayPointerClass obj;
  obj.pointingArray(arr);

  return 0;
}

【讨论】:

  • 在您的示例中,“newArray[2]”是在堆栈中创建的。它将在 pointingArray 函数结束时被销毁。由于那个“arr”将被分配悬空指针。
【解决方案2】:

*arr = newArray;行不通,你不能像那样复制一个 C 数组。 你可以做 memcpy() 或 std::copy() 之类的;

memcpy( newArray, arr, 2);

std::copy( newArray, newArray+2, arr);

【讨论】:

    【解决方案3】:

    感谢大家的回答(即使有部分工作) 我找到了自己的解决方案

    // PointerArray.cpp : Defines the entry point for the console application.
    //
    
    #include "stdafx.h"
    #include <iostream>
    #include <string>
    using namespace std;
    
    
    
    int* test() {
    
        int size_needed = 2;
    
        int* a = new int[size_needed];
        a[0] = 0;
        a[1] = 0;
    
        return a;
    }
    
    
    int main()
    {
        //int arr[2] = { 1, 1 };
        int* arr = test();
    
    
        for (int i = 0; i < 2; i++){
            cout << arr[i] << std::endl;
        }
        cin.get();
        return 0;
    } 
    

    【讨论】:

    • 您正在分配“a”,但您没有通过删除来解除分配。这会给您在大型项目中带来麻烦。
    • 不能再问任何问题....编程是我的生活,我不能再寻求帮助了,为什么???????????????
    • 如果您将此站点用作帮助站点,则说明您使用错误。这不是一个帮助站点,而是一个问答库,这是一个很大的区别。
    • 没问题,但我不明白那个判断。无论如何,我没有时间解释我可怜的不公平感,我会创建另一个帐户(PS:我讨厌这些认为他们是比我优越,并导致此禁令。我以我的体面知识回答了有关 Stackoverflow 的问题,我让像你这样的人在没有任何深刻理由的情况下判断我并否决我的帖子)
    猜你喜欢
    • 1970-01-01
    • 2020-03-26
    • 2013-07-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-19
    • 1970-01-01
    • 2017-12-17
    • 2010-12-21
    相关资源
    最近更新 更多