11深刻理解C指针之---指针和常量

  该系列文章源于《深刻理解C指针》的阅读与理解,因为本人的见识和知识的欠缺可能有误,还望你们批评指教。安全

  指针做为C语言的左膀右臂,使用方便,修改容易,引用数据快速都是颇有前景的应用。C语言中常量是值不能改变的量,因为在某些应用中,想要阻止没有受权的数据的修改时,就须要将指针和常量结合起来。spa

  先看如下代码:指针

 1 #include <stdio.h>                                                                                                  
 2 
 3 int main(int argc, char **argv)
 4 {
 5     int iVar1 = 30;
 6     int *ptrVar1 = &iVar1;
 7     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
 8     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
 9 
10     iVar1++;
11     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
12     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
13 
14     (*ptrVar1)++;
15     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
16     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
17 
18     return 0;
19 }

  代码结果:code

iVar1 value: 30 and iVar1 address: 0x5b483c1c
*ptrVar1 value: 30 ptrVar1 value: 0x5b483c1c and ptrVar1 address: 0x5b483c10
iVar1 value: 31 and iVar1 address: 0x5b483c1c
*ptrVar1 value: 31 ptrVar1 value: 0x5b483c1c and ptrVar1 address: 0x5b483c10
iVar1 value: 32 and iVar1 address: 0x5b483c1c
*ptrVar1 value: 32 ptrVar1 value: 0x5b483c1c and ptrVar1 address: 0x5b483c10

  经过以上代码不难发现,将指针指向变量后,不管经过指针或变量均可以轻松修改变量。有时只是想利用指针的便利,而又不想承担指针能够修改变量的风险是,与const结合无疑是最好的。blog

  1、const修饰指针定义:经过指针引用的方式修改变量将会被禁止

    一、特征:

      1)、提供一种特殊的方式来操纵数据

      2)、指针的值能够改变

      3)、不能经过指针改变指向变量的值io


    二、两种形式,两种形式彻底同样的:编译

      1)、int const *ptrVar1;

      2)、const int  *ptrVar1;
      
  将代码1的第6行代码改成以下:class

6     int const *ptrVar1 = &iVar1;

  代码编译错误以下:test

test11_01.c:14:12: 错误:令只读位置‘*ptrVar1’自增
  (*ptrVar1)++;
            ^~

  只有将第14行以下代码注释掉,才能经过编译:变量

(*ptrVar1)++;

  再看以下代码段:

 1 #include <stdio.h>
 2 
 3 int main(int argc, char **argv)
 4 {
 5     int iVar1 = 30;
 6     int iVar2 = 90;
 7     int const *ptrVar1 = &iVar1;
 8     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
 9     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
10 
11     iVar1++;
12     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
13     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
14 
15     ptrVar1 = &iVar2;
16     printf("iVar2 value: %d and iVar2 address: %#x\n", iVar2, &iVar2);                                              
17     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
18 
19     return 0;
20 }

  结果以下:

iVar1 value: 30 and iVar1 address: 0xf15c983c
*ptrVar1 value: 30 ptrVar1 value: 0xf15c983c and ptrVar1 address: 0xf15c9830
iVar1 value: 31 and iVar1 address: 0xf15c983c
*ptrVar1 value: 31 ptrVar1 value: 0xf15c983c and ptrVar1 address: 0xf15c9830
iVar2 value: 90 and iVar2 address: 0xf15c9838
*ptrVar1 value: 90 ptrVar1 value: 0xf15c9838 and ptrVar1 address: 0xf15c9830

  根据定义,容易知道因为const修饰的是*ptrVar1,是指针的引用,所以没法经过指针引用修改变量的值,可是依旧能够经过变量赋值修改变量,并且指针变量能够指向其余变量如iVar2等。

  2、const修饰指针定义:能够经过指针引用的方式修改变量,禁止指针指向其余变量

    一、特征:

      1)、提供一种特殊的方式来操纵数据

      2)、指针的值不能够改变

      3)、经过指针改变指向变量的值


    二、应用形式:

      1)、int  * const ptrVar1;

  将代码2的第6行代码改成以下:

6     int * const ptrVar1 = &iVar1;

  代码编译错误以下:

test11_01.c:15:10: 错误:向只读变量‘ptrVar1’赋值
  ptrVar1 = &iVar2;

  只有将第15行以下代码注释掉或改成(*ptrVar1)++,才能经过编译:

ptrVar1 = &iVar2;

  请看以下具体代码段:

 1 #include <stdio.h>
 2 
 3 int main(int argc, char **argv)
 4 {
 5     int iVar1 = 30;
 6     int *const ptrVar1 = &iVar1;                                                                                    
 7     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
 8     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
 9 
10     iVar1++;
11     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
12     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
13 
14     //ptrVar1 = &iVar2;
15     (*ptrVar1)++;
16     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
17     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
18 
19     return 0;
20 }

  根据定义,容易知道因为const修饰的是ptrVar1,是指针变量自身,指针的值不能改变。所以能够经过指针引用修改变量的值,也能够经过变量赋值修改变量,可是指针变量不能够指向其余变量如iVar2等。

  3、const修饰指针定义,同时修改指针变量:经过指针引用的方式修改变量将会被禁止,指针也不能指向其余变量

    一、特征:

      1)、提供一种特殊的方式来操纵数据

      2)、指针的值不能够改变

      3)、不可经过指针改变指向变量的值


    二、应用形式:

      1)、int const  * const ptrVar1;

  代码以下:

   1 #include <stdio.h>
   2 
   3 int main(int argc, char **argv)
   4 {
   5     int iVar1 = 30;
   6     int iVar2 = 90;                                                                                               
   7     int const *const ptrVar1 = &iVar1;
   8     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
   9     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
  10 
  11     iVar1++;
  12     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
  13     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
  14 
>>15     ptrVar1 = &iVar2;
  16     //(*ptrVar1)++;
  17     printf("iVar1 value: %d and iVar1 address: %#x\n", iVar1, &iVar1);
  18     printf("*ptrVar1 value: %d ptrVar1 value: %#x and ptrVar1 address: %#x\n", *ptrVar1, ptrVar1, &ptrVar1);
  19 
  20     return 0;
  21 }

  保留第15行代码,编译错误以下:

test11_01.c:15:10: 错误:向只读变量‘ptrVar1’赋值
  ptrVar1 = &iVar2;
          ^

  保留第16行代码,编译错误以下:

test11_01.c:16:12: 错误:令只读位置‘*ptrVar1’自增
  (*ptrVar1)++;
            ^~

  因而可知,经过两个const的修饰,使得不管是指针变量的值,仍是指针变量的解引用值都没法改变,能够有效提升数据的安全性。

相关文章
相关标签/搜索