标签: pointers

char*argv []是什么意思?

我是C编程的新手,我遇到了一个问题.
如果复杂的声明,我发现了这一点

int *daytab[13]; // daytab is an array of 13 pointers to int
Run Code Online (Sandbox Code Playgroud)

这意味着daytab是数组的名称,数组的名称指向数组的第一个元素.数组名称与像daytab++etc等指针操作不兼容(如果我错了,请纠正我).

但我发现这段代码是用Dennis Ritchie编写的

main(int argc, char * argv[]) {
    while( --argc > 0 )                    
        printf("%s%s",*++argv,(argc>1) > " " : "");

    printf("\n");
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

他们怎么操纵argv?它不是数组名称吗?

c arrays pointers kernighan-and-ritchie

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

C++试图从std :: function获取函数地址

我试图从std :: function中找到函数的地址.

第一个解决方案是:

size_t getAddress(std::function<void (void)> function) {
    typedef void (fnType)(void);
    fnType ** fnPointer = function.target<fnType *>();
    return (size_t) *fnPointer;
}
Run Code Online (Sandbox Code Playgroud)

但这只适用于带有(void())签名的函数,因为我需要签名为(void(Type&))的函数,我试图做

template<typename T>
size_t getAddress(std::function<void (T &)> function) {
    typedef void (fnType)(T &);
    fnType ** fnPointer = function.target<fnType *>();
    return (size_t) *fnPointer;
}
Run Code Online (Sandbox Code Playgroud)

我得到"错误 - 预期"('用于函数式转换或类型构造"

更新:有没有办法捕获成员类地址?对于我正在使用的班级成员:

template<typename Clazz, typename Return, typename ...Arguments>
size_t getMemberAddress(std::function<Return (Clazz::*)(Arguments...)> & executor) {
    typedef Return (Clazz::*fnType)(Arguments...);
    fnType ** fnPointer = executor.template target<fnType *>();
    if (fnPointer != nullptr) {
        return (size_t) * fnPointer; …
Run Code Online (Sandbox Code Playgroud)

c++ pointers function std

13
推荐指数
2
解决办法
9895
查看次数

为什么C支持负数组索引?

从SO中的这篇文章来看,很明显C支持负指数.

  1. 为什么在程序中支持这种潜在的内存违规?

  2. 编译器不应该至少抛出一个负指数警告吗?(我正在使用GCC)

  3. 或者这个计算是在运行时完成的?

编辑1: 任何人都可以暗示它的用途吗?

编辑2: 用于3.)使用[]数组/指针中的循环计数器表示指数的运行时计算.

c arrays pointers

13
推荐指数
4
解决办法
8822
查看次数

什么是指针调整?

我正在阅读关于维基百科上的整数溢出,并且在看到的字段中遇到了Pointer Swizzling这个术语.
我用谷歌搜索指针调配,但无法理解它.
任何人都可以解释什么是指针调配?

c c++ pointers

13
推荐指数
1
解决办法
2382
查看次数

参考与指针

有什么不同?因为这:

int Value = 50;
int *pValue = &Value;

*pValue = 88;
Run Code Online (Sandbox Code Playgroud)

和ref版本做同样的事情:

int Value = 50;
int &rValue = Value;

rValue = 88;
Run Code Online (Sandbox Code Playgroud)

哪一个更好用?谢谢.

c++ pointers reference

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

删除后指针本身会发生什么?

void doSomething()
{  
    TheObject *ptr = new TheObject;
    delete ptr;
    ptr = NULL;
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

让我借用cplusplus.com中operator delete的字样:

释放由ptr指向的内存块(如果不为null),通过调用operator new释放先前分配给它的存储空间,并使该指针位置无效.

请帮助清除我的困惑:删除后指针本身会发生什么?指针本身确实有一个地址,对吗?所以在删除指向的块之后,指针本身呢?

在返回指针初始化的方法后,我可以说指针本身是自由的吗?指针本身是放在堆栈还是堆上?

c++ pointers

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

Swift:将未初始化的C结构传递给导入的C函数

我知道这个答案,但这不是一回事 - 那就是传递一个用分配初始化的指针.

我正在与具有以下结构定义的C库连接:

typedef struct myStruct { unsigned char var [50]; } myStruct;
Run Code Online (Sandbox Code Playgroud)

有一个函数可以传递结构的地址 - 通常基于堆栈而不是堆,因此:

myStruct mine;
initMyStruct(&mine);
Run Code Online (Sandbox Code Playgroud)

这会初始化结构的内容 - 调用者不知道内存的内部格式,因此会混淆.

在Swift中,我正在创建一个类,它将封装结构和与其他C函数接口的接口.

class MyClass {

    var mine : myStruct

    init() {

        initMyStruct(&mine)
        // Error: Variable 'self.msg' passed by reference before being initialized

    }

}
Run Code Online (Sandbox Code Playgroud)

我不能为我的生活弄清楚如何初始化结构,或者如果可以替代使用一个点.

mine = myStruct()
// Fails because you aren't providing the value of the member 'var'

mine = myStruct((CUnsignedChar(), CUnsignedChar(), /*... repeat to 50 */))
// Cannot find an overload for 'init' …
Run Code Online (Sandbox Code Playgroud)

c macos struct pointers swift

13
推荐指数
2
解决办法
5854
查看次数

严格的别名规则真的是"双向的"吗?

这些评论用户@Deduplicator坚持认为,严格别名规则允许通过一个不兼容的类型的访问,如果任一混叠或混叠指针的是一个指针到字符的类型(合格或不合格,符号或无符号char *).所以,他的断言基本上都是这两个

long long foo;
char *p = (char *)&foo;
*p; // just in order to dereference 'p'
Run Code Online (Sandbox Code Playgroud)

char foo[sizeof(long long)];
long long *p = (long long *)&foo[0];
*p; // just in order to dereference 'p'
Run Code Online (Sandbox Code Playgroud)

符合并定义了行为.

但是,在我的阅读中,它只是第一种有效的形式,也就是说,当别名指针是指向char的指针时; 但是,在另一个方向上不能这样做,即当别名指针指向不兼容的类型(字符类型除外)时,别名指针为a char *.

所以,上面第二个片段会有未定义的行为.

情况怎样?它是否正确?为了记录,我已经阅读了这个问题和答案,并且接受的答案明确指出了这一点

规则允许例外char *.它总是假设char *其他类型别名.但是这不会起作用,没有假设你的结构别名为chars的缓冲区.

(强调我的)

c pointers strict-aliasing

13
推荐指数
1
解决办法
478
查看次数

C++向量迭代器与指针

有很多替代方法来处理向量的元素.

我可以像这样使用指针:

vector<int> v = {10, 11, 12};
int *p = &v[0];
cout << *p;    //Outputs "10"
Run Code Online (Sandbox Code Playgroud)

我也可以这样使用指针:

vector<int> v = {10, 11, 12};
vector<int>::pointer p = v.data();
cout << *p;    //Outputs "10"
Run Code Online (Sandbox Code Playgroud)

我也可以使用迭代器类型:

vector<int> v = {10, 11, 12};
vector<int>::iterator i = v.begin();
cout << *i;    //Outputs "10"
Run Code Online (Sandbox Code Playgroud)

我在这里缺少哪些重大差异?

c++ pointers iterator vector

13
推荐指数
2
解决办法
5002
查看次数

在不同平台上使用void指针

我听说指针首先应该转换为void以确保不同平台上的值的一致性,并且应该使用%p格式说明符.它为什么以及究竟是什么问题?

int x=100;
int *pi=&x;
printf("value of pi is: %p",(void*)pi);
Run Code Online (Sandbox Code Playgroud)

c pointers void-pointers format-specifiers

13
推荐指数
3
解决办法
976
查看次数