1、指針類型和指向的數據類型不同時
#include <stdio.h> //指針除了指明地址以外,還指明了類型,類型決定了數據的大小和數據的解析方式 int main() { char ch='a'; int i= 100000; double d= 1444.54; float f=123.4f; char * pch = &ch; int *pi = &i; double *pd = &d; float *pf =&i; pch =pi; //指針char類型字節數小於int類型 ,*pch漏讀 //pch是char類型的指針,它會從&ch開始的地址往后讀char指針類型長度的數據,也就是1個字節的數據,而pi的數據有四個字節,有3個字節的數據讀不到 pd =pi; //指針double類型字節數大於int 類型, *pd多讀 //pd是double類型的指針,它會從&pd開始的地址往后讀double指針類型長度的數據,也就是8個字節的數據,而pi的數據有四個字節,會導致往后多讀4個字節的垃圾數據 pf=pi; //指針float類型字節數等於int 類型, 不會多讀或漏讀,但是同樣的二進制數,int和float的解析方式不一樣,也會導致*pf讀的內容錯誤 printf("%c,%f,%f\n",*pch,*pd,*pf); //結論:指針類型盡量一致,如果不一致,或大或小都有問題 //不同數據類型,大小不一樣,解析方式也會不一樣,即使地址相同,大小相同 return 0; pch =(char *)0x645afed; //強制類型轉換,指明只能從0x645afed往后讀取char類型個字節 }
2、指針類型和指向的數據類型相同時
#include <stdio.h> //用於數據通信,共用一個變量 void main() { int num =5; int *p1 =# int *p2 =p1; printf("%d,%d,%d\n",num,*p1,*p2); //5,5,5 *p1 = 10; printf("%d,%d,%d\n",num,*p1,*p2); //10,10,10 *p2 =100; printf("%d,%d,%d\n",num,*p1,*p2); //100,100,100 }