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等等。很可爱。