标签: pointers

const指针到指针在C和C++中意味着什么?

我知道从右到左阅读声明的经验法则,我很清楚我知道发生了什么,直到一位同事告诉我:

const MyStructure** ppMyStruct;
Run Code Online (Sandbox Code Playgroud)

表示"ppMyStruct是指向(可变)MyStructure的const指针 "(在C++中).

我本以为它意味着"ppMyStruct是一个指向const MyStructure指针的指针 ".我在C++规范中寻找答案,但显然我不是很擅长......

在C++中意味着什么,它在C中意味着什么?

c c++ pointers const

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

用于多级指针解引用?

什么时候使用任何语言的指针要求有人使用多个指针,让我们说一个三指针.什么时候使用三指针而不是只使用常规指针是有意义的?

例如:

char  * * *ptr;
Run Code Online (Sandbox Code Playgroud)

代替

char *ptr;
Run Code Online (Sandbox Code Playgroud)

c++ pointers

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

何时使用void指针?

我理解使用void指针来实现malloc.

void* malloc  ( size_t size );
Run Code Online (Sandbox Code Playgroud)

任何人都可以提出其他原因或提供一些在实践中有用的场景.

谢谢

c c++ pointers

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

作为对象的类成员 - 指针与否?C++

如果我创建一个MyClass类并且它有一些私有成员说MyOtherClass,那么将MyOtherClass作为指针是否更好?将它作为存储在内存中的指针而不是指针也意味着什么?创建类时是否会创建对象?

我注意到QT中的示例通常在类成员时将类成员声明为指针.

问候

标记

c++ memory pointers class-design member

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

为什么int指针'++'增加4而不是1?

指针的值是变量的地址.为什么int pointerint指针增加1后增加4个字节的值.

在我看来,我认为指针(变量的地址)的值仅在指针递增后增加1个字节.

测试代码:

int a = 1, *ptr;
ptr = &a;
printf("0x%X\n", ptr);
ptr++;
printf("0x%X\n", ptr);
Run Code Online (Sandbox Code Playgroud)

预期产量:

0xBF8D63B8
0xBF8D63B9
Run Code Online (Sandbox Code Playgroud)

实际输出:

0xBF8D63B8
0xBF8D63BC
Run Code Online (Sandbox Code Playgroud)

编辑:

另一个问题 - 如何访问4个字节并int逐个占用?

c c++ pointers

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

通过指针传递并通过引用传递

可能重复:
C++中指针变量和引用变量之间有什么区别?
在C++中通过引用传递指针是否有好处?

在这两种情况下,我都取得了成果.那么什么时候优先于另一个呢?我们使用其中一个的原因是什么?

#include <iostream>
using namespace std;
void swap(int* x, int* y)
{
    int z = *x;
    *x=*y;
    *y=z;
}
void swap(int& x, int& y)
{
    int z = x;
    x=y;
    y=z;
}

int main()
{
    int a = 45;
    int b = 35;
    cout<<"Before Swap\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(&a,&b);
    cout<<"After Swap with pass by pointer\n";
    cout<<"a="<<a<<" b="<<b<<"\n";

    swap(a,b);
    cout<<"After Swap with pass by reference\n";
    cout<<"a="<<a<<" b="<<b<<"\n";
}
Run Code Online (Sandbox Code Playgroud)

产量

Before Swap
a=45 b=35
After Swap with pass by pointer …
Run Code Online (Sandbox Code Playgroud)

c++ pointers reference parameter-passing

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

声明指针类型?

我刚刚读到我们需要在C(或C++)中声明它们时给出指针类型,即:

int *point ;
Run Code Online (Sandbox Code Playgroud)

据我所知,指针存储变量的地址,并且地址占用相同数量的内存,无论哪种类型.那么,为什么我们需要声明它的类型?

c c++ pointers

42
推荐指数
7
解决办法
2431
查看次数

在 C++ 中,将结构体的标量成员视为构成数组是否有效?

在查看Dear Imgui的代码时,我发现了以下代码(为了相关性进行了编辑):

struct ImVec2
{
    float x, y;
    float& operator[] (size_t idx) { return (&x)[idx]; }
};
Run Code Online (Sandbox Code Playgroud)

很明显,这在实践中是有效的,但是从 C++ 标准的角度来看,这段代码合法吗?如果没有,任何主要编译器(G++、MSVC、Clang)是否提供任何显式或隐式保证该代码将按预期工作?

c++ struct pointers strict-aliasing undefined-behavior

42
推荐指数
4
解决办法
3864
查看次数

在C中打印指针

我试图用指针理解一些东西,所以我写了这段代码:

#include <stdio.h>

int main(void)
{
    char s[] = "asd";
    char **p = &s;

    printf("The value of s is: %p\n", s);
    printf("The direction of s is: %p\n", &s);

    printf("The value of p is: %p\n", p);
    printf("The direction of p is: %p\n", &p);

    printf("The direction of s[0] is: %p\n", &s[0]);
    printf("The direction of s[1] is: %p\n", &s[1]);
    printf("The direction of s[2] is: %p\n", &s[2]);

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

用gcc编译时我得到以下警告:

$ gcc main.c -o main-bin -ansi -pedantic -Wall -lm
main.c: In function ‘main’: …
Run Code Online (Sandbox Code Playgroud)

c pointers

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

printf用于显示用0填充的指针的正确用法是什么

在C中,我想使用printf来显示指针,以便它们正确排列,我想用0填充它们.

我的猜测是,正确的方法是:

printf("%016p", ptr);

这有效,但是这个gcc抱怨以下消息:

warning: '0' flag used with ‘%p’ gnu_printf format

我已经谷歌搜索了一下,以下主题是关于同一主题,但并没有真正给出解决方案.

http://gcc.gnu.org/ml/gcc-bugs/2003-05/msg00484.html

阅读它,似乎gcc抱怨的原因是我建议的语法没有在C99中定义.但我似乎无法找到任何其他方式以标准批准的方式做同样的事情.

所以这是双重问题:

  • 我的理解是否正确,这种行为不是由C99标准定义的?
  • 如果是这样,是否有标准的,可移植的方式这样做?

c printf pointers c99

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