日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

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

發布時間:2025/4/14 编程问答 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 11深入理解C指针之---指针和常量 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

  該系列文章源于《深入理解C指針》的閱讀與理解,由于本人的見識和知識的欠缺可能有誤,還望大家批評指教。

  指針作為C語言的左膀右臂,使用方便,修改容易,引用數據快速都是很有前景的應用。C語言中常量是值不能改變的量,由于在某些應用中,想要阻止沒有授權的數據的修改時,就需要將指針和常量結合起來。

  先看以下代碼:

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 }

  代碼結果:

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結合無疑是最好的。

  一、const修飾指針定義:通過指針引用的方式修改變量將會被禁止

    1、特征:

      1)、提供一種特殊的方式來操縱數據

      2)、指針的值可以改變

      3)、不能通過指針改變指向變量的值


    2、兩種形式,兩種形式完全一樣的:

      1)、int const *ptrVar1;

      2)、const int? *ptrVar1;
      
  將代碼1的第6行代碼改為如下:

6 int const *ptrVar1 = &iVar1;

  代碼編譯錯誤如下:

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等。

  二、const修飾指針定義:可以通過指針引用的方式修改變量,禁止指針指向其他變量

    1、特征:

      1)、提供一種特殊的方式來操縱數據

      2)、指針的值不可以改變

      3)、通過指針改變指向變量的值


    2、應用形式:

      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等。

  三、const修飾指針定義,同時修改指針變量:通過指針引用的方式修改變量將會被禁止,指針也不能指向其他變量

    1、特征:

      1)、提供一種特殊的方式來操縱數據

      2)、指針的值不可以改變

      3)、不可通過指針改變指向變量的值


    2、應用形式:

      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的修飾,使得無論是指針變量的值,還是指針變量的解引用值都無法改變,可以有效提高數據的安全性。

  

轉載于:https://www.cnblogs.com/guochaoxxl/p/6956506.html

總結

以上是生活随笔為你收集整理的11深入理解C指针之---指针和常量的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。