标签: pointers

如何在C中声明一个常量函数指针数组?

我需要声明一个指向函数的指针数组,如下所示:

extern void function1(void);
extern void function2(void);
...

void (*MESSAGE_HANDLERS[])(void) = {
   function1,
   function2,
   ...
};
Run Code Online (Sandbox Code Playgroud)

但是,我希望将数组声明为常量 - 数组中的数据和指向数据的指针.不幸的是,我不记得在哪里放置const关键字.

我假设在这种情况下,实际指针MESSAGE_HANDLERS已经是常量,因为它被声明为数组.另一方面,如果声明如图所示,那么数组中的函数指针是否可以在运行时更改?

c arrays pointers const function-pointers

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

C中"野指针"的含义是什么?

任何人都可以告诉我,C中的野指针的含义,如何获取它,这在C++中是否可用?

c pointers

22
推荐指数
4
解决办法
1万
查看次数

C++指针数组

在C++中,如果我想要一个指针数组,以便我可以让它们在后一阶段指向不同的对象,那么语法是什么样的.

编辑

我想澄清一下我想做什么.我有一个类foo,它有和添加方法.在add方法中,我引用了类bar.我想将该引用保存到bar的指针数组中.指针栏数组需要一直扩展,这样我就没有问题了.它是在指针堆上创建和数组,以便我稍后可以为它们分配bar对象.我试过的似乎失败了,因为类bar没有编译器抱怨的默认构造函数.这让我想到我正在创建一些我不想做的实际对象.

请不要,我不想听到你认为这是多么疯狂等等,这是你的意见.

c++ arrays pointers

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

在C++中为抽象类模板创建接口

我有如下代码.我有一个抽象模板类Foo和两个子类(Foo1和Foo2),它们派生自模板的实例化.我希望在我的程序中使用指向Foo1或Foo2类型的对象的指针,因此我创建了一个接口IFoo.

我的问题是我不确定如何在界面中包含functionB,因为它依赖于模板实例化.甚至可以通过界面使functionB可访问,还是我尝试不可能?

非常感谢您的帮助.

class IFoo {
    public:
        virtual functionA()=0;

};

template<class T>
class Foo : public IFoo{
    public:
        functionA(){ do something; };
        functionB(T arg){ do something; };
};

class Foo1 : public Foo<int>{
...
};

class Foo2 : public Foo<double>{
...
};
Run Code Online (Sandbox Code Playgroud)

c++ inheritance templates pointers interface

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

去相当于C中的void指针

我一直在玩Go有点制作一些数据结构库,我有一个大问题.我希望数据结构能够包含任何类型,但是我没有看到任何方法在Go中执行此操作,因为您无法声明void指针,并且它们没有像NSObject这样的类,所有内容都继承自.我如何在Go中实现相同的功能?

pointers go

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

将字节偏移量添加到任何指针的便携且安全的方法

我很擅长使用C++,并且没有掌握语言的所有复杂性和细微之处.

在C++ 11中向任何类型的指针添加任意字节偏移量的最便携,正确和安全的方法是什么?

SomeType* ptr;
int offset = 12345 /* bytes */;
ptr = ptr + offset;             // <--
Run Code Online (Sandbox Code Playgroud)

我在Stack Overflow和Google上找到了很多答案,但他们都提出了不同的建议.我遇到的一些变种:

  1. 演员char *:

    ptr = (SomeType*)(((char*)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 演员unsigned int:

    ptr = (SomeType*)((unsigned int)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  3. 演员size_t:

    ptr = (SomeType*)((size_t)ptr) + offset);
    
    Run Code Online (Sandbox Code Playgroud)
  4. "大小size_t并且ptrdiff_t总是与指针的大小一致.因此,这些类型应该用作大型数组的索引,用于存储指针和指针算术." - 关于 CodeProject上的size_t和ptrdiff_t

    ptr = (SomeType*)((size_t)ptr + (ptrdiff_t)offset);
    
    Run Code Online (Sandbox Code Playgroud)
  5. 或者像之前的那样,但是intptr_t代替的size_t是签名而不是签名的:

    ptr = (SomeType*)((intptr_t)ptr + (ptrdiff_t)offset);
    
    Run Code Online (Sandbox Code Playgroud)
  6. 仅转换为intptr_t,因为offset已经是有符号整数而intptr_t …

c++ pointers pointer-arithmetic c++11

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

在数组char指针的情况下,'数组名称'是什么意思?

在我的代码中:

 char *str[] = {"forgs", "do", "not", "die"};
 printf("%d %d", sizeof(str), sizeof(str[0]));  
Run Code Online (Sandbox Code Playgroud)

我得到了输出12 2,所以我怀疑是:

  1. 为什么会有区别?
  2. 这两个strstr[0]是字符指针,对不对?

c pointers sizeof

22
推荐指数
3
解决办法
4313
查看次数

为什么堆栈上的char []而堆上的char*?

我对发生的事情感到非常困惑.我一直以为char *并且char []可以互换,但是在查看内存地址后,它似乎char *在堆中分配空间,而char []在堆栈上分配内存.

char stack[] = "hello";
char *heap = "hello";

char *heap_string_malloc = malloc(5);
heap_string_malloc = "hello";

printf("Address of stack[0]: %p\n", stack);
printf("Address of heap[0]: %p\n", heap);
printf("Address of heap_string_malloc[0]: %p\n", heap_string_malloc);
Run Code Online (Sandbox Code Playgroud)

输出以下内容:

Address of stack[0]: 0x7fff8b0b85b0
Address of heap[0]: 0x400760
Address of heap_string_malloc[0]: 0x400760
Run Code Online (Sandbox Code Playgroud)

这是否意味着char *动态分配?

令我困惑的是,为什么malloc分配与已分配的内存地址相同的内存地址char *heap?我没有运行任何优化(简单gcc file.c).

c memory pointers

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

strtok() - 为什么你必须传递NULL指针才能获得字符串中的下一个标记?

这是strtok()的解释.

#include <string.h>
char* strtok( char* s1, 
              const char* s2 );*
Run Code Online (Sandbox Code Playgroud)

第一次调用strtok()会返回指向s1指向的字符串中第一个标记的指针.对strtok()的后续调用必须将NULL指针作为第一个参数传递,以便获取字符串中的下一个标记.

但我不知道,为什么你必须传递NULL指针才能获得字符串中的下一个标记.我搜索了大约15分钟,但没有在互联网上找到解释.

c c++ string pointers strtok

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

在C&C++中使用const限定符指向数组的指针

考虑以下计划:

int main()
{
    int array[9];
    const int (*p2)[9] = &array;
}
Run Code Online (Sandbox Code Playgroud)

它在C++中编译得很好(请参见此处的实时演示),但在C中编译失败.默认情况下,GCC会发出以下警告.(见此处的现场演示).

prog.c: In function 'main':
prog.c:4:26: warning: initialization from incompatible pointer type [enabled by default]
     const int (*p2)[9] = &array;
Run Code Online (Sandbox Code Playgroud)

但如果我使用-pedantic-errors选项:

gcc -Os -s -Wall -std=c11 -pedantic-errors -o constptr constptr.c
Run Code Online (Sandbox Code Playgroud)

它给了我以下编译器错误

constptr.c:4:26: error: pointers to arrays with different qualifiers are incompatible in ISO C [-Wpedantic]
Run Code Online (Sandbox Code Playgroud)

为什么它在C中编译失败而在C++中没有?C&C++标准对此有何看法?

如果我在数组声明语句中使用const限定符,它也可以在C中编译.那么,上面的程序中发生了什么?

c c++ arrays pointers const

22
推荐指数
1
解决办法
2840
查看次数