标签: pointers

引用如何内部存储在c ++中?

我只是想知道,如何在内部存储引用?我觉得深层次的理解会让我更好地理解概念指针与参考,并做出决策选择.

我怀疑它基本上与指针一样,但编译器负责处理指针.请指教.

c++ pointers reference

12
推荐指数
2
解决办法
2630
查看次数

C++字符串和指针

我正在学习C++,目前我正在使用字符串和指针.

我正在按照练习册和我创建的以下问题之一:

#include <iostream>
#include <string>

using namespace std;

int main(void){
    string * firstName=nullptr;
    string * lastName=nullptr;
    string * displayName=nullptr;

    cout << "Enter your first name: " << endl;
    getline(cin,*firstName);

    cout << "Enter your last name: " << endl;
    getline(cin,*lastName);

    displayName=new string;
    *displayName= *lastName + ", " + *firstName;

    cout << "Here's the information in a single string: " << displayName;
    cin.get();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

为了使用更多的指针,我试图将它与字符串混合在一起,并因此而使解决方案变得更加复杂.当我运行这个时,我得到一个"未处理的异常:访问冲突读取位置xxxxxxxxx".

有人可以通过仍然使用指针和字符串而不是char数组(我已经弄清楚如何做)来建议解决方案吗?

c++ string pointers

12
推荐指数
2
解决办法
7万
查看次数

C++:const char*const*的含义

在其中一个C++程序中,我看到了一个函数原型: int Classifier::command(int argc, const char*const* argv)

什么const char*const* argv意思?它是一样的const char* argv[]吗?是否const char** argv也意味着相同?

c++ pointers function-parameter function-prototypes

12
推荐指数
2
解决办法
1万
查看次数

如何将未知大小的二维数组传递给函数

我想创建类库,一个函数,其参数是一个未知大小的矩阵,用户将创建自己的矩阵并使用自己的大小并将其传递给此函数,对其矩阵进行一些操作,如下所示,将是功能

calculateDeterminantOfTheMatrix( int matrix[][])
{
   some Operations to do on matrix 
}
Run Code Online (Sandbox Code Playgroud)

c++ pointers function matrix

12
推荐指数
2
解决办法
2万
查看次数

在C中初始化整数指针数组

关于C中指针的使用,我有一些困惑/问题.我已经把下面的示例代码轻松地理解了.请注意这些代码的不同之处.如果您对它有一些问题,请收到反馈.

这不起作用.

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

void process() {
    int *arr;
    arr=(int*)malloc(5*sizeof(int));
    arr=(int*){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

但这很有效.

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

void process() {
    int *arr;
    arr=(int*)malloc(5*sizeof(int));
    arr=(int[]){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这也有效.为什么?我没有在这里分配内存.

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

void process() {
    int *arr;
    arr=(int[]){3,1,4,5,2};
    for(int z=0;z<5;z++) {
        printf("%d ",arr[z]);
    }
    printf("\n");
}

int main() {
    process();
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c arrays pointers

12
推荐指数
2
解决办法
4万
查看次数

从pcl :: PointCloud创建一个pcl :: PointCloud :: Ptr

我想知道这是否可行.我有一个功能:

 pcl::PointCloud<pcl::PointXYZRGB> createPointCloud(std::Vector<Nodes> input)
Run Code Online (Sandbox Code Playgroud)

返回点云.我想知道是否可以采用这一点云,并指出它的副本.pcl像这样指向云:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(new pcl::PointCloud<pcl::PointXYZRGB>)
Run Code Online (Sandbox Code Playgroud)

我试过这样做:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(createPointCloud(nodeList))
Run Code Online (Sandbox Code Playgroud)

这导致了一个非常明显的错误,即.createPointCloud不会返回指向云的指针.

我也试过这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR = &createPointCloud(nodeList)
Run Code Online (Sandbox Code Playgroud)

还有这个:

pcl::PointCloud<pcl::PointXYZRGB>::Ptr cloudPTR(&createPointCloud(nodeList))
Run Code Online (Sandbox Code Playgroud)

这导致编译错误:"获取临时地址"

是函数返回指针类型的唯一选择还是有办法做我要求的?

编辑:

以下两个答案都是正确的,我已经给Jonathon这个时候第一次得到了正确的答案.

c++ pointers point-cloud-library

12
推荐指数
2
解决办法
2万
查看次数

C++使用方括号和实例指针

我创建了一个单例类,它使用GetInstance()方法获取实例地址(指针).在类中,我有一个unsigned long int数组,我已经operator []为它创建了它(直接访问数组).我如何使用我得到的指针GetInstance才能使用[] operator?我试过了 :

class risc { // singleton
protected:
unsigned long registers[8];
static risc* _instance;
risc() {
    for (int i=0;i<8;i++) {
        registers[i]=0;};
    }
public:
unsigned long   operator   [](int i) const  {return registers[i];}; // get []
unsigned long & operator   [](int i)        {return registers[i];}; // set []
static risc* getInstance() { // constructor
        if (_instance==NULL) {
            _instance=new risc();
        }
        return _instance;
    }
};

risc* Risc=getInstance();
*Risc[X]=...
Run Code Online (Sandbox Code Playgroud)

但它不起作用...有没有办法可以使用括号直接使用类指针访问数组?

谢谢 !

c++ pointers class operand

12
推荐指数
1
解决办法
9980
查看次数

具有自定义指针类型的内存分配器

我试图创建一个使用智能指针的自定义内存分配器.我没有发布代码,因为它太大而且没有添加太多信息.然后我用一个测试它std::vector.它在Xcode上运行得非常好.但是当我尝试在Visual Studio 12(2013)中构建相同的代码时,构建失败并出现以下错误:

... vector(873):错误C2660:' std::_Wrap_alloc< my_allocator< int > >::construct':函数不带2个参数

问题出在push_back方法中:

void push_back(value_type&& _Val)
    {
    ....
        this->_Getal().construct(this->_Mylast,
            _STD forward<value_type>(this->_Myfirst[_Idx]));
    ....
    }
Run Code Online (Sandbox Code Playgroud)

错误消息有点令人困惑.真正的问题是this->_Mylast类型my_allocator< int >::pointer,它是一个智能指针,而构造方法是期望的int*.

所以,问题很简单:自定义内存分配器中使用的指针类型有哪些要求?应该X::pointer可以转换为原始指针?如果是的话,它会让它们变得毫无用处.

实际上我希望这行代码看起来像:

this->_Getal().construct(addressof(*(this->_Mylast)),
            _STD forward<value_type>(this->_Myfirst[_Idx]));
Run Code Online (Sandbox Code Playgroud)

让我们尝试在C++标准中找到答案,其中说:

[17.6.3.5-5]分配器类型X应满足CopyConstructible(17.6.3.1)的要求.的X::pointer,X::const_pointer,X::void_pointer,和X::const_void_pointer类型应满足NullablePointer(17.6.3.3)的要求.对这些类型的构造函数,比较运算符,复制操作,移动操作或交换操作不应通过异常退出.X::pointer并且X::const_pointer还应满足随机访问迭代器的要求(24.2)

如果我们看看NullablePointer reqs,他们会添加一些其他要求:

[17.6.3.3] NullablePointer类型是一种类似指针的类型,支持空值.如果符合以下条件,则类型P满足NullablePointer的要求:
(1.1) - P满足EqualityComparable,DefaultConstructible,CopyConstructible,CopyAssignable和Destructible的要求......

如果我检查随机访问迭代器的要求,我也没有找到任何明确提到它的转换为原始指针.但是在很少的地方使用了方法addressof(例如24.2.1-5).

此外,它并不是Microsoft std::vector实现中唯一X::pointer与假定原始指针相等的地方.我想知道,我错过了什么?

编辑:我将在这里添加一段my_allocator deffinition:

class my_allocator
{
public:

typedef std::size_t          size_type;
typedef std::ptrdiff_t …
Run Code Online (Sandbox Code Playgroud)

c++ pointers memory-management standard-library c++11

12
推荐指数
1
解决办法
1564
查看次数

在调试Swift代码时,我是否可以获得仅给定其地址的对象的类型引用?

在LLDB中调试Objective-C代码时,我经常使用它们的地址创建引用内存中对象的变量.例如:

(lldb) po self.view
<UIView: 0x7ff5f7a18430; frame = (0 64; 320 504); autoresize = W+H; layer = <CALayer: 0x7ff5f7a192e0>>
(lldb) e CALayer* $layer = (CALayer*) 0x7ff5f7a192e0
(lldb) e $layer.borderWidth
(CGFloat) $17 = 0
Run Code Online (Sandbox Code Playgroud)

鉴于对象的类型及其在内存中的地址,我能够检查和操作它.

调试Swift代码时这是不可能的吗?

pointers objective-c ios lldb swift

12
推荐指数
1
解决办法
1968
查看次数

将指向内存缓冲区的指针转换为指向VLA的指针

在C中,我相信以下程序是有效的:将指向已分配内存缓冲区的指针转换为如下数组:

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

#define ARRSIZE 4

int *getPointer(int num){
    return malloc(sizeof(int) * num);
}

int main(){
    int *pointer = getPointer(ARRSIZE);
    int (*arrPointer)[ARRSIZE] = (int(*)[ARRSIZE])pointer;

    printf("%d\n", sizeof(*arrPointer) / sizeof((*arrPointer)[0]));

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

(这输出4).

但是,在C99中,使用VLA进行此操作是否安全?

    int arrSize = 4;
    int *pointer = getPointer(arrSize);
    int (*arrPointer)[arrSize] = (int(*)[arrSize])pointer;

    printf("%d\n", sizeof(*arrPointer) / sizeof((*arrPointer)[0]));

    return 0;
Run Code Online (Sandbox Code Playgroud)

(也是输出4).

根据C99标准,这是否合法?

如果它是合法的,那将是很奇怪的,因为这意味着VLA有效地启用动态类型创建,例如,类型的类型type(*)[variable].

c arrays pointers c99

12
推荐指数
1
解决办法
681
查看次数