Linux下C測試多個*兩個const

 

在linux下的gcc測試當類型中有多個*時,

最多兩個const不會出現警告並且必須格式TYPE *const*const p=&a;

警告 const TYPE**p; TYPEconst**const p=&a;const TYPE **cosnt p=&a;TYPE *const*const*const*const*const..p;

且由後面兩個警告得TYPEconst**const p=&a;和const TYPE **cosnt p=&a;等效。

只要不出錯,警告出來的一般可以運行(但是是破壞性的)。

推測TYPE const*const*const*const*const*const p=&a;由const依次得到對應類型

TYPE、TYPE*、TYPE**、TYPE***、TYPE****、TYPE*****,顯然對應的這些被限定爲不可賦值.當然一些const可能不會有。

因此我覺得TYPEconst*const p=&a;寫成這樣會好理解。

--------------------------以下全部在Linux下,使用的是gcc

正確(兩個**兩個const)

//編譯 gcc const.c
//運行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 TYPE *const*const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 **p=A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}

[ pcdtest]$ ./a.out
memory**:0x7fffa4714d90 memory*:0x7fffa4714d98  data:321
memory**:0x7fffa4714d90 memory*:0x7fffa4714d9c  data:453
memory**:0x7fffa4714d90 memory*:0x7fffa4714d9c  data:321
正確(三個星兩個const)

//編譯 gcc const.c
//運行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE **A3=&A2;
 TYPE **const*const p=&A3;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 A2=&A11;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 ***p=A1;
 printf("memory***:%p memory**:%p memory:*:%p  data:%d\n",p,*p,**p,***p);
 return 0;
}


**********************************以下兩個警告,可以看到TYPE const**const p=&A2;和const TYPE**const p=&A2;等效均會造成警告。

const_.c: In function ‘main’:
const_.c:12: 警告:從不兼容的指針類型初始化
[ pcdtest]$ ./a.out
memory**:0x7fff0097c300 memory*:0x7fff0097c308  data:321
memory**:0x7fff0097c300 memory*:0x7fff0097c30c  data:453
memory**:0x7fff0097c300 memory*:0x7fff0097c308  data:321

 

//編譯 gcc const.c
//運行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 TYPE const* *const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 *p=&A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}


 

//編譯 gcc const.c
//運行 ./a.out
#include<stdio.h>
#include<string.h>
typedef int TYPE;
int main()
{
 TYPE A11=453;
 TYPE A1=321;
 TYPE *A2=&A1;
 TYPE *A22=&A11;
 const TYPE **const p=&A2;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 A2=&A11;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 *p=&A1;
 printf("memory**:%p memory*:%p  data:%d\n",p,*p,**p);
 return 0;
}

*************************************

最後給個字符串的

警告:

const_.c: In function ‘main’:
const_.c:10: 警告:初始化丟棄了指針目標類型的限定

//編譯 gcc const.c
//運行 ./a.out
#include<stdio.h>
#include<string.h>
typedef char* TYPE;
int main()
{
 TYPE ca2="_before_me";
 const TYPE ca="me";
 TYPE  *const p=&ca;
 TYPE caf="afterme";
 printf("memory:%p data:%s\n",&ca2,ca2);
 printf("memory:%p data:%s\n",p,*p);
 printf("memory:%p data:%s\n",&caf,caf);
 //破壞性使用
 *p="hello_word";
 printf("memory:%p data:%s\n",&ca2,ca2);
 printf("memory:%p data:%s\n",p,*p);
 printf("memory:%p data:%s\n",&caf,caf);
 printf("memory:%p data:%s\n",&ca,ca);
 return 0;
}

打印結果:
memory:0x7fff719439d0 data:_before_me
memory:0x7fff719439c8 data:me
memory:0x7fff719439c0 data:afterme
memory:0x7fff719439d0 data:_before_me
memory:0x7fff719439c8 data:hello_word
memory:0x7fff719439c0 data:afterme
memory:0x7fff719439c8 data:hello_word

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