C语言指针类型和类型转换
C語言指針類型和類型轉換
指針類型
指針是強類型,意思是特定類型的指針變量存放特定類型變量的地址,比如int * 需要一個指向整形的指針來存放整形數據的地址,char* 需要一個指向字符型的指針來存放字符型數據的地址,那為什么說指針是個強類型呢?指針不僅用來表示變量的地址,同時也得使用指針來解引用地址的內容,以此方便修改和使用變量的值。說到這里,我們又得來回顧一下數據類型所占空間的大小(32位機器)
int - 4byte char - 1byte float - 4byte我們用一個實例來說明指針是強類型這個特性,我們知道內存是連續的,我們定義一個變量
int a = 1025;這個變量用二進制表示為0x10000000001,在內存中的示意可表示如下
| 二進制值 | 00000000 | 00000000 | 00000100 | 00000001 |
| 假設地址 | 0x203 | 0x202 | 0x201 | 0x200 |
整形變量的最高位是符號位,也就是正負符號位
類型轉換
我們這時去用代碼來看一下整形指針、字符型指針的區別
#include <stdio.h>int main() {int a = 1025;int *p;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);return 0; }上面的代碼我們知道打印出來的值是a的地址和1025這個值
我們再定義一個字符型指針的變量,再來打印變量的值,將上面的代碼修改為
#include <stdio.h>int main() {int a = 1025;int *p;char *p0;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);p0 = (char *)p;//這里要做類型轉換printf("size of char is %d bytes\n",sizeof(char));printf("Address = %d, value = %d\n",p0,*p0);return 0; }打印出來的內容我們看一下
從上面的打印結果來看,p和p0的地址是一樣的,那么為什么打印的值卻是不同的呢?這里就是數據類型的問題,我們再回到上面的表中,1025 = 0b00000000 00000000 00000100 00000001,整形是以4個字節大小存儲的,字符型是以1個字節大小存儲的,字符型指針表示整形指針時會將高3位的數據丟失,只留下最低位的字節數據,也就是00000001,所以這里打印出來的值是1。
為了進一步理解這個指針類型,我們看一下p0+1和*(p0+1)的值是多少,代碼如下
#include <stdio.h>int main() {int a = 1025;int *p;char *p0;p = &a;printf("size of integer is %d bytes\n",sizeof(int));printf("Address = %d, value = %d\n",p,*p);p0 =(char *) p;printf("size of char is %d bytes\n",sizeof(char));printf("Address = %d, Vaule = %d\n",p0,*p0);printf("Address of p0+1 = %d, Vaule of *(p0+1) = %d\n" ,p0+1,*(p0+1));return 0; }從打印結果來看,p0+1的地址增大一個字節,解引用的值為4,這里的4也就是00000100,上面是強制將p的地址存入p0,它倆的數據類型不同,所存儲的內容也有所不同(僅有一個字節數據存入)。提醒我們在使用指針變量時要時刻考慮數據類型,以及是否適合做類型轉換。
總結
以上是生活随笔為你收集整理的C语言指针类型和类型转换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Cadence 元器件封装库命名规范
- 下一篇: VS2015 C#程序打包成.exe之i