我知道从右到左阅读声明的经验法则,我很清楚我知道发生了什么,直到一位同事告诉我:
const MyStructure** ppMyStruct;
Run Code Online (Sandbox Code Playgroud)
表示"ppMyStruct是指向(可变)MyStructure的const指针 "(在C++中).
我本以为它意味着"ppMyStruct是一个指向const MyStructure指针的指针 ".我在C++规范中寻找答案,但显然我不是很擅长......
在C++中意味着什么,它在C中意味着什么?
什么时候使用任何语言的指针要求有人使用多个指针,让我们说一个三指针.什么时候使用三指针而不是只使用常规指针是有意义的?
例如:
char * * *ptr;
Run Code Online (Sandbox Code Playgroud)
代替
char *ptr;
Run Code Online (Sandbox Code Playgroud) 我理解使用void指针来实现malloc.
void* malloc ( size_t size );
Run Code Online (Sandbox Code Playgroud)
任何人都可以提出其他原因或提供一些在实践中有用的场景.
谢谢
如果我创建一个MyClass类并且它有一些私有成员说MyOtherClass,那么将MyOtherClass作为指针是否更好?将它作为存储在内存中的指针而不是指针也意味着什么?创建类时是否会创建对象?
我注意到QT中的示例通常在类成员时将类成员声明为指针.
问候
标记
指针的值是变量的地址.为什么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逐个占用?
在这两种情况下,我都取得了成果.那么什么时候优先于另一个呢?我们使用其中一个的原因是什么?
#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(或C++)中声明它们时给出指针类型,即:
int *point ;
Run Code Online (Sandbox Code Playgroud)
据我所知,指针存储变量的地址,并且地址占用相同数量的内存,无论哪种类型.那么,为什么我们需要声明它的类型?
在查看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)是否提供任何显式或隐式保证该代码将按预期工作?
我试图用指针理解一些东西,所以我写了这段代码:
#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中,我想使用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中定义.但我似乎无法找到任何其他方式以标准批准的方式做同样的事情.
所以这是双重问题: