C++ 这两个与stuct相关的声明之间有区别吗?

C++ 这两个与stuct相关的声明之间有区别吗?,c++,pointers,struct,C++,Pointers,Struct,我有以下结构 typedef struct _LSHFunctionT { double *a; double b; } LSHFunctionT, *PLSHFunctionT; 我的问题是,;这两种声明之间有区别吗 PLSHFunctionT myPointer1; PLSHFunctionT *myPointer3; 及 如果没有,那么为什么人们会显式地使用其中的两个(LSHFunctionT和*plshunctiont)。为什么不直接使用lshfunction呢

我有以下结构

typedef struct _LSHFunctionT 
{
    double *a;
    double b;
} LSHFunctionT, *PLSHFunctionT;
我的问题是,;这两种声明之间有区别吗

PLSHFunctionT myPointer1;
PLSHFunctionT *myPointer3;

如果没有,那么为什么人们会显式地使用其中的两个(LSHFunctionT和*plshunctiont)。为什么不直接使用lshfunction呢

以下两个声明的方式相同吗

PLSHFunctionT myPointer1;
PLSHFunctionT *myPointer3;


我觉得没什么区别。有不同的编程风格。

是的。即使在第二种情况下,它们也完全相同

如果我想声明指针,我个人更喜欢显式地使用
*
。在大多数情况下,它使代码可读。指针类型的
typedef
的使用通常会降低可读性,尽管有时可能会提高可读性,尤其是在使用Windows API时

typedef struct _LSHFunctionT 
{
    double *a;
    double b;
} LSHFunctionT, *PLSHFunctionT;
是,
PLSHFunctionT x
等于
LSHFunctionT*x

是的,
PLSHFunctionT*x
等于
LSHFunctionT**x

typedef
的目的是为现有类型分配新名称。您可以定义
typedef int-lol和声明变量
lol i,但是编译器无论如何都会考虑它<代码> int >代码>
您还应检查以下问题:


希望这有帮助。

区别在于重点。通常不明确写入*可能表示PLSHFunctionT被设计为用作句柄(不知道/访问结构元素)。如果*是显式写入的,如在LSHFunctionT*myPointer中,它可能表示用于访问值的数组或结构。

是的,它们是相同的

定义指针类型的一个很好的理由是用于复杂的表达式。例如,如果您有一个引用指针的函数,您觉得哪一个更容易理解

void foo(PLSHFunctionT & ref);

void foo(LSHFunctionT * (&ref));

我甚至不确定第二个的语法是否正确

这些声明是相同的。指针typedef方法在某些情况下提高了代码的可读性。有人可能会说:

PLSHFunctionT calls[];
比这更容易阅读:

LSHFunctionT *calls[];

从表面上看,两者没有区别。然而,对于指针typedef,无法将其声明为指向常量的指针,而只能声明为指向非常量的常量指针

比如你可以说

const lshfunction*const_ptr
常量plshfunction常量ptr2使指针常量,而不是指针对象


<>最后注意到,C++中的整个事物都是可疑的合法性,因为从代码< > <代码>开始的名字被保留用于实现,并且类型DEBRs几乎从来没有这样使用过。

并且对你的问题“为什么人们明确地使用其中两个(LSHButt和*PLSHealt)”,我认为有些人只是找到它。“更干净”写的是
Pwhatever ptr
whather*ptr
更干净,因为他们不喜欢星号之类的东西。::耸耸肩:
void foo(LSHFunctionT*&ref)
很好。不需要使用额外的大括号。@Nawaz,谢谢。但你明白我的意思-很难记住这是否是你每天都做的事情。起初我确实有错误,但我做了一个快速编辑。是的。很容易出错。你可以尝试
void foo(lshfunction&*ref)
这是一个编译错误。但是当您使用
typedef
时,同样可能出现这种情况。例如
typedef T&RT;void foo(RT*ptr)
这是一个编译错误。啊,是的,Windows API,带有PSTR、LPSTR、PCSTR、LPCSTR、LPCTSTR、LPUTSTR、LPCUTSR等等。很可爱。