const char **,char *const *,char ** const

1、告警

test_cpp.c

#include <stdlib.h>
#include <stdio.h>

int main()
{
        char c = 'c';

        char *p = &c;

        char **pp = &p;
        const char **cpp = &p;
        char const **c_pp = &p;
        char  * const *pcp = &p;
        char  ** const ppc = &p;

        return 0;
}

編譯的時候有如下警告:

x@ubuntu:~/Desktop/const$ gcc text_cpp.c
text_cpp.c: In function ‘main’:
text_cpp.c:11:21: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
  const char **cpp = &p;
                     ^
text_cpp.c:12:22: warning: initialization of ‘const char **’ from incompatible pointer type ‘char **’ [-Wincompatible-pointer-types]
  char const **c_pp = &p;
                      ^

看到上面的警告,第一時間就是有點懵,和"經驗不符“,我們常見的是如下用法:

#include <stdlib.h>
#include <stdio.h>

int main()
{
         char c = 'c';

        const char *p = &c;
        char const *q = &c;
        char *const r = &c;

        return 0;
}

上述用法都是ok的,編譯不會有告警。我查了很多資料,大致搞清楚了上面告警的原因。上面告警原因在《C專家編程》中有解釋,而且也參考了本文後面網址的資料。

先來看看ANSI C中的規定:“兩個操作數都是指向有限定符或無限定符的相容類型的指針,左邊指針指向的類型必須有右邊指針指向類型的全部限定符“。這句話的前半句強調類型,後半句強調限定符(修飾符)。 出現編譯告警的地方,如果不看修飾符const,賦值完全沒有問題,問題出現在const修飾符。

const char **,char *const *,char ** const

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章