C++ “写作的好方法”;指向某物的指针;在C/C++;

C++ “写作的好方法”;指向某物的指针;在C/C++;,c++,c,pointers,typography,C++,C,Pointers,Typography,在C/C++中是否有一种“好”的方法来编写“指向某物的指针”? 我经常写voidfoo(char*str)但有时我发现它非常不合逻辑,因为str的类型是“指向字符的指针”,那么将*附加到类型名称应该更符合逻辑。 有写指针的规则吗 char*str; char* str; char *str; char * str; 没有严格的规则,但请记住,*附加到变量,因此: char *str1, *str2; // str1 and str2 are pointers char* str1, str2;

在C/C++中是否有一种“好”的方法来编写“指向某物的指针”?
我经常写
voidfoo(char*str)
但有时我发现它非常不合逻辑,因为
str
的类型是“指向字符的指针”,那么将
*
附加到类型名称应该更符合逻辑。
有写指针的规则吗

char*str;
char* str;
char *str;
char * str;

没有严格的规则,但请记住,
*
附加到变量,因此:

char *str1, *str2; // str1 and str2 are pointers
char* str1, str2;  // str1 is a pointer, str2 is a char
有些人也喜欢做char*str1,但这取决于你或你公司的编码标准。

好方法取决于

  • 项目中的内部编码标准
  • 你的个人喜好

  • (可能)按那个顺序。

    我认为这将受到声明变量的一般模式的严重影响

    例如,我倾向于每行只声明一个变量。这样,我可以添加一条注释,提醒如何使用变量

    然而,有时在一行上声明几个相同类型的变量是可行的。在这种情况下,我的个人编码规则是永远,永远,永远在同一行声明指针作为非指针。我发现混用它们可能是错误的来源,所以我试图通过避免混用来更容易看到“错误”

    只要我遵循第一条准则,我发现只要我是一致的,如何声明指针并不重要

    然而,如果我使用第二条准则并在同一行上声明几个指针,我发现下面的样式是最有益和清晰的(当然其他人可能不同意)

    由于*和指针名称之间没有空格,因此更容易发现我是否违反了第二条准则

    现在,如果我想在我的两个个人风格准则之间保持一致,当在一行上只声明一个指针时,我会使用

    char  *ptr;
    

    不管怎么说,这就是我为什么要这么做的部分原因。希望这能有所帮助。

    这没有对错之分。重要的是选择一个编码标准并坚持它


    也就是说,我个人认为*属于类型,而不是变量名,因为类型是“指向char的指针”。变量名不是指针 t*p,而普通C++约定是编写代码> t*p。两者都解析为
    T(*p)
    *
    是声明符的一部分,而不是类型说明符。这纯粹是指针声明语法的意外,您可以用任何一种方式编写它

    C(扩展而言,C++)声明语法是以表达式为中心的;注意,声明的形式应该与代码中相同类型的表达式的形式匹配

    例如,假设我们有一个指向
    int
    的指针,并且希望访问该整数值。为此,我们使用
    *
    间接运算符取消对指针的引用,如下所示:

    x = *p; 
    
    表达式
    *p
    的类型为
    int
    ;因此,
    p
    的声明应该是

    int *p  
    
    p
    的整数由类型说明符
    int
    提供,而
    p
    的指针整数由声明符
    *p
    提供

    作为一个稍微复杂一点的例子,假设我们有一个指向
    float
    数组的指针,并希望通过指针访问数组第
    i
    个元素的浮点值。我们取消引用数组指针并为结果下标:

    f = (*ap)[i];
    
    表达式
    (*ap)[i]
    的类型是
    float
    ,因此数组指针的声明是

    float (*ap)[N];
    
    ap
    的浮点值由类型说明符
    float
    提供,但指针和数组的浮点值由声明符
    (*ap)[N]
    提供。注意,在这种情况下,
    *
    必须显式绑定到标识符<在表达式和声明语法中,code>[]的优先级高于一元
    *
    ,因此
    float*ap[N]
    将被解析为
    float*(ap[N])
    ,或“指向
    float
    的指针数组”,而不是“指向
    float
    数组的指针”。我想你可以这样写

    float(* ap)[N];
    
    但我不确定重点是什么;这并不能使ap的类型更加清晰

    更好的方法是,使用指向函数的指针返回指向
    int
    的指针数组:

    int *(*(*f)())[N];
    
    同样,至少两个
    *
    运算符必须显式绑定在声明符中;将最后一个
    *
    绑定到类型说明符,如中所示

    int* (*(*f)())[N];
    
    只是表示思维混乱

    即使我在自己的C++代码中使用它,即使我理解它为什么变得流行,但我在<>代码> T*P< <代码>约定的推理中所遇到的问题是它不适用于最简单的指针声明之外,它加强了C和C++声明语法错误视图的简单化。是的,

    p
    的类型是“指向T的指针”,但这并没有改变这样一个事实,即就语言语法而言,
    *
    绑定到声明符,而不是类型说明符

    对于另一种情况,如果
    a
    的类型是“T的N元素数组”,我们就不写了

    显然,语法不允许这样做。同样,这个论点在这种情况下并不适用

    编辑

    正如Steve在评论中指出的,您可以使用typedef来隐藏一些复杂性。例如,您可以重写

    int *(*(*f)())[N];
    
    差不多

    typedef int *iptrarr[N];           // iptrarr is an array of pointer to int
    typedef iptrarr *arrptrfunc();     // arrptrfunc is a function returning
                                       // a pointer to iptrarr
    
    arrptrfunc *f;                     // f is a pointer to arrptrfunc
    
    现在,您可以干净地应用
    T*p
    约定,将
    f
    声明为
    arrptrfunc*f
    。我个人不喜欢用这种方式做事,因为这不一定从我的角度看清楚
    int *(*(*f)())[N];
    
    typedef int *iptrarr[N];           // iptrarr is an array of pointer to int
    typedef iptrarr *arrptrfunc();     // arrptrfunc is a function returning
                                       // a pointer to iptrarr
    
    arrptrfunc *f;                     // f is a pointer to arrptrfunc