标签: pointers

通过指针算法访问数组值与使用C中的下标访问数组值

我继续读到,在C中,使用指针算法通常比下标数组访问更快.即使使用现代(据称是优化的)编译器,这是真的吗?

如果是这样,当我开始在Mac上学习C到Objective-C和Cocoa时,情况仍然如此吗?

在C和Objective-C中,哪种是数组访问的首选编码风格?被认为(由各自语言的专业人士)更清晰,更"正确"(缺乏更好的术语)?

c arrays pointers objective-c pointer-arithmetic

38
推荐指数
3
解决办法
1万
查看次数

什么是C++中的**?

我已经看到了一些代码,以及我的编译器生成的一些错误,这些错误**在变量之前有一个' '标记(例如**变量名未引用 - 或者其他东西,我不能完全回想起来).我相当肯定这与指针有关,如果我不得不猜测它看起来像是试图取消引用两次.' **'是相当不容易的.有人能指出我一个好的网站/文档,或者有人会在这里解释一下吗?

谢谢.

很好的回应.如果我可以添加,那么指向指针的指针有什么用呢?你不应该只使用原始指针而不是创建另一个指向原始指针的指针吗?

c++ pointers

38
推荐指数
7
解决办法
5万
查看次数

什么是void指针,什么是空指针?

所以我正在经历一些面试问题,我遇到了一个关于void和null指针的问题,声称:

没有返回类型的指针称为空指针.它可以是任何类型的数据类型.

这彻底迷惑了我!它似乎无效,根据这个问题,null可以互换使用,我不相信这是正确的.我假设void是一个返回类型,null是一个值.但我只是一个代码新手,我不确定我是对的.

请表达您对空指针是什么以及空指针是什么的看法.我不是在寻找null和void之间的区别.

c++ pointers void-pointers null-pointer

38
推荐指数
5
解决办法
3万
查看次数

Go的临时地址?

处理这种情况最简洁的方法是什么:

func a() string {
    /* doesn't matter */
}

b *string = &a()
Run Code Online (Sandbox Code Playgroud)

这会生成错误:

不能取一个()的地址

我的理解是,如果采用地址,Go会自动将局部变量提升到堆中.这里很清楚,要采用返回值的地址.处理这个问题的惯用方法是什么?

pointers return temporary rvalue go

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

调用golang结构函数给出"不能引用未导出的字段或方法"

我有一个像这样的golang结构:

type MyStruct struct {
    Id    string
}
Run Code Online (Sandbox Code Playgroud)

和功能:

func (m *MyStruct) id() {
   // doing something with id here
}
Run Code Online (Sandbox Code Playgroud)

我还有另一个这样的结构:

type MyStruct2 struct {
    m *MyStruct
}
Run Code Online (Sandbox Code Playgroud)

现在我有一个功能:

func foo(str *MyStruct2) {
    str.m.id()
}
Run Code Online (Sandbox Code Playgroud)

但是我在编译时遇到错误:

str.m.id undefined (cannot refer to unexported field or method mypackage.(*MyStruct)."".id
Run Code Online (Sandbox Code Playgroud)

如何正确调用此功能?

谢谢

struct pointers go

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

减去指针

我被要求描述这些代码行正在为大学作业做些什么

int main() {
    int t1[] = {0,0,1,1,1}, t2[] = {0,0,1,1,1};
    int *p1 = t1, *p2 = t2;

    while (!*p1++ || !*p2++);
    cout << (p1-t1) << endl;
    cout << (p2-t2) << endl;
}
Run Code Online (Sandbox Code Playgroud)

我的看法是,创建了2个int类型的数组并填充了值,创建了2个指针并指向每个数组,然后我开始遇到麻烦.

while (!*p1++ || !*p2++);
Run Code Online (Sandbox Code Playgroud)

对我来说这是说在0移动*p1一个地方的位置或0移动*p2一个地方的位置时,我对这个假设真的没有信心吗?

cout << (p1-t1) << endl;
Run Code Online (Sandbox Code Playgroud)

那么我们继续前进cout,现在我对此的看法是,我正在从位置减去p1位置t1,在那里p1被while定位并t1指向数组中的第一个位置.我可能完全错了,我只是在学习指针,所以如果我的假设错了,请记住这一点.

c++ pointers

38
推荐指数
4
解决办法
2501
查看次数

64位平台的效率:指针与32位数组索引

在他的一个主题演讲中,Andrei Alexandrescu建议,在64位平台上,使用32位数组索引比使用原始指针更快:

第16页:http://www.slideshare.net/andreialexandrescu1/three-optimization-tips-for-c-15708507

在他的Facebook帐户上,他更精确,并说:"更喜欢数组索引到指针(这个似乎每十年逆转一次)."

我已经尝试了许多方法来找到差异,但我还没有设法构建任何显示这种差异的程序.知道安德烈,我不会感到惊讶,差异不超过百分之几,但如果有人找到这样的例子,我会很高兴.

这是我做过的测试.我选择n = 5000,足够大以获得合适的时序并且足够小以使一切都适合L1缓存.我循环了几次,以便CPU频率上升.

#include <iostream>
#include <chrono>

int main(int argc, const char* argv[]) {
  const int n{5000};
  int* p{new int[n]};

  // Warm up the cache
  for (int i{0}; i < n; i++) {
    p[i] += 1;
  }

  for (int j{0}; j < 5; j++) {
    {
      auto start_pointer = std::chrono::high_resolution_clock::now();
      for (int* q{p}; q != p + n; ++q) {
        ++(*q);
      }
      auto end_pointer = std::chrono::high_resolution_clock::now();
      auto time_pointer = std::chrono::duration_cast<std::chrono::nanoseconds>(
                              end_pointer - …
Run Code Online (Sandbox Code Playgroud)

c++ arrays performance pointers

38
推荐指数
3
解决办法
2805
查看次数

在C中,带有两个星号(**)的变量声明是什么意思?

我和C一起工作,我有点生疏了.我知道它*有三个用途:

  1. 声明一个指针.
  2. 取消引用指针.
  3. 乘法

但是,**在变量声明之前有两个星号()时它意味着什么:

char **aPointer = ...
Run Code Online (Sandbox Code Playgroud)

谢谢,

斯科特

c pointers

37
推荐指数
4
解决办法
3万
查看次数

C++ 11智能指针语义

我已经使用了几年的指针,但我最近才决定转换到C++ 11的智能指针(即唯一,共享和弱).我对它们做了很多研究,这些是我得出的结论:

  1. 独特的指针很棒.他们管理自己的内存,并且像原始指针一样轻量级.首选尽可能多地使用unique_ptr而不是原始指针.
  2. 共享指针很复杂.由于引用计数,它们具有显着的开销.通过const引用传递它们或后悔你的方式的错误.它们不是邪恶的,但应该谨慎使用.
  3. 共享指针应该拥有对象; 在不需要所有权时使用弱指针.锁定weak_ptr具有与shared_ptr复制构造函数相同的开销.
  4. 继续忽略auto_ptr的存在,现在无论如何都不推荐使用它.

因此,考虑到这些原则,我开始修改我的代码库以利用我们新的闪亮智能指针,完全打算清除尽可能多的原始指针.然而,我对如何最好地利用C++ 11智能指针感到困惑.

例如,让我们假设我们正在设计一个简单的游戏.我们认为将虚构的Texture数据类型加载到TextureManager类中是最佳的.这些纹理很复杂,因此按值传递它们是不可行的.此外,让我们假设游戏对象需要特定的纹理,具体取决于它们的对象类型(即汽车,船等).

之前,我会将纹理加载到矢量(或其他容器,如unordered_map)中,并在每个相应的游戏对象中存储指向这些纹理的指针,以便在需要渲染时可以引用它们.让我们假设纹理保证比指针寿命更长.

那么,我的问题是如何在这种情况下最好地利用智能指针.我看到几个选项:

  1. 将纹理直接存储在容器中,然后在每个游戏对象中构造unique_ptr.

    class TextureManager {
      public:
        const Texture& texture(const std::string& key) const
            { return textures_.at(key); }
      private:
        std::unordered_map<std::string, Texture> textures_;
    };
    class GameObject {
      public:
        void set_texture(const Texture& texture)
            { texture_ = std::unique_ptr<Texture>(new Texture(texture)); }
      private:
        std::unique_ptr<Texture> texture_;
    };
    
    Run Code Online (Sandbox Code Playgroud)

    然而,我对此的理解是,新的纹理将从传递的引用中复制构造,然后由unique_ptr拥有.这让我觉得非常不受欢迎,因为我会使用与使用它的游戏对象一样多的纹理副本 - 击败指针点(没有双关语意).

  2. 不直接存储纹理,而是存储容器中的共享指针.使用make_shared初始化共享指针.构造游戏对象中的弱指针.

    class TextureManager {
      public:
        const std::shared_ptr<Texture>& texture(const std::string& key) const
            { return textures_.at(key); }
      private:
        std::unordered_map<std::string, std::shared_ptr<Texture>> textures_;
    };
    class GameObject {
      public:
        void set_texture(const std::shared_ptr<Texture>& …
    Run Code Online (Sandbox Code Playgroud)

c++ pointers smart-pointers c++11

37
推荐指数
2
解决办法
7660
查看次数

将字符串指向字符串

是否可以从指向字符串的指针获取字符串值?

我正在使用goopt包来处理标志解析,而包只返回*string.但我想使用这些值来调用地图中的函数.

举个例子.

var strPointer = new(string)
*strPointer = "string"

functions := map[string]func() {
    "string": func(){
        fmt.Println("works")
    },
}  

//Do something to get the string value

functions[strPointerValue]()
Run Code Online (Sandbox Code Playgroud)

你可以看到这里展示的问题http://play.golang.org/p/1s0-d-GO-L

pointers go

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