 const的作(zuo)用
							時間:2019-05-24      來源:華清(qing)遠見
							const的作(zuo)用
							時間:2019-05-24      來源:華清(qing)遠見 
							在c語言中,關鍵字const修飾變(bian)量(liang)(liang)(liang),可以使得變(bian)量(liang)(liang)(liang)常(chang)量(liang)(liang)(liang)化(hua)。所謂的常(chang)量(liang)(liang)(liang)化(hua),就意味(wei)著“readonly”。
它的規則(ze):const離(li)誰(shui)近,誰(shui)就(jiu)不能被(bei)修改
下面我們一(yi)起來通過示例來看(kan)下:
一、const修飾變量
1 #include <stdio.h>
2    
3 int main(int argc, const char *argv[])
4 {
5 const int a = 10;
6 int const b = 10;
7
8 printf("a = %d,b = %d\n",a,b);
9 return 0;
10 }
程(cheng)序運行(xing)結果如下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,b = 10
現在我們對變量進(jin)行下修改
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 const int a = 10;
6 int const b = 10;
7
8 a = 20;
9 b = 30;  
10
 11 printf("a = %d,b = %d\n",a,b);
12 return 0;
13 }
程序運行(xing)結(jie)果如(ru)下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘a’
a = 20;
^
test.c:9:4: error: assignment of read-only variable ‘b’
b = 30;
^
上面兩種(zhong)寫法都(dou)是允許的,變量a和(he)b有const修飾,則a和(he)b的值(zhi)不能被修改。
二、const修飾(shi)指(zhi)針
1.常(chang)量化(hua)指針(zhen)(zhen)目標表(biao)達式,限制通過指針(zhen)(zhen)改變其目標的數值。一般形式如下:
const <數據類型> *<指針(zhen)變(bian)量名> [=<指針(zhen)運算表(biao)達式>]
請看下(xia)面示例代碼:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 const int *p;
7
8 p = &a;
9 printf("a = %d,*p = %d\n",a,*p);
10
11 p = &b;    
 12 printf("b = %d,*p = %d\n",b,*p);
13 return 0;
14 }
程序(xu)運行結果如(ru)下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
b = 20,*p = 20
現在我們對(dui)指針的目標(biao)進行修改(gai):
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 const int *p;
7
8 p = &a;
9 printf("a = %d,*p = %d\n",a,*p);
10
11 p = &b;
12 printf("b = %d,*p = %d\n",b,*p);
13
14 *p = 30;
15 printf("*p = %d\n",*p);
16
17 return 0;
18 }
程序運行結(jie)果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:14:5: error: assignment of read-only location ‘*p’
*p = 30;
^
通(tong)過以上測(ce)試,我們沒有辦法通(tong)過p來改變目標地(di)址的(de)(de)內容(rong),最常見的(de)(de)用法就是(shi)main函(han)數(shu)的(de)(de)參數(shu)。
2.常量化指針變量
常量(liang)(liang)化指(zhi)針變量(liang)(liang),是(shi)的指(zhi)針變量(liang)(liang)存儲的地(di)址值不(bu)能修改,一(yi)般說明(ming)形(xing)式(shi)如下:
<數據(ju)類型> * const <指針變量名(ming)> [=<指針運算表達(da)式>]
請看下面示例代碼:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10;    
6 int * const p = &a;
7
8 printf("a = %d,*p = %d\n",a,*p);
9 return 0;
10 }
程序運行結果如下:
yxl@ubuntu:~$ gcc test.c
yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
現在我們來修(xiu)改下(xia)代碼(ma):
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
6 int * const p = &a;
7 p = &b;  
8
9 printf("a = %d,*p = %d\n",a,*p);
10 return 0;
11 }
程序運(yun)行結果如下:
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:7:4: error: assignment of read-only variable ‘p’
p = &b;
^
通過以(yi)上示例(li),我(wo)們可以(yi)看出此時指針(zhen)變量的指向是(shi)不可以(yi)修改的。
3.常量(liang)化指(zhi)針(zhen)變(bian)量(liang)及其目標(biao)表達式,一般(ban)說明形式如下:
const <數據(ju)類型> * const <指(zhi)針變量名> [=<指(zhi)針運算表達式(shi)>]
請(qing)看下面示(shi)例代碼(ma):
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10;    
6 const int * const p = &a;
7
8 printf("a = %d,*p = %d\n",a,*p);
9 return 0;
10 }
程序運行結果如下:
yxl@ubuntu:~$ gcc test.c
.yxl@ubuntu:~$ ./a.out
a = 10,*p = 10
現在我(wo)們來修改下(xia)代碼:
1 #include <stdio.h>
2
3 int main(int argc, const char *argv[])
4 {
5 int a = 10,b = 20;
  6 const int * const p = &a;
7
8 p = &b;
9 *p = 30;
10    
11   printf("a = %d,*p = %d\n",a,*p);
12 return 0;
13 }
程序運行結果如下(xia):
yxl@ubuntu:~$ gcc test.c
test.c: In function ‘main’:
test.c:8:4: error: assignment of read-only variable ‘p’
p = &b;
^
test.c:9:5: error: assignment of read-only location ‘*p’
*p = 30;
^
通過以上示例(li),我們(men)可(ke)以看出,此時指針的指向和(he)目標的內容都不可(ke)以修改。

