目錄
一、內存和地址
二、指針變量和地址
三、指針變量類型的意義
一、內存和地址
只要講指針就離不開內存
因為指針就是訪問內存的
計算上CPU(中央處理器)在處理數據的時候,需要的數據是在內存中讀取的,處理后的數
據也會放回內存中,那我們買電腦的時候,電腦上內存是8GB/16GB/32GB等,那這些內存空間如何高效的管理呢?
其實也是把內存劃分為?個個的內存單元,每個內存單元的大小取1個字節
計算機常見單位
bit - ?特位
byte - 字節
KB
MB
GB
TB
PB1byte = 8bit
1KB = 1024byte
1MB = 1024KB
1GB = 1024MB
1TB = 1024GB
1PB = 1024TB
內存單元編號==地址==指針
二、指針變量和地址
CPU訪問內存中的某個字節空間,必須知道這個字節空間在內存的什么位置,?因為內存中字節很多,所以需要給內存進?編址(就如同宿舍很多,需要給宿舍編號?樣)。計算機中的編址,并不是把每個字節的地址記錄下來,?是通過硬件設計完成的。
?先,必須理解,計算機內是有很多的硬件單元,?硬件單元是要互相協同?作的。所謂的協同,?少相互之間要能夠進?數據傳遞。但是硬件與硬件之間是互相獨?的,那么如何通信呢?答案很簡單,?"線"連起來。?CPU和內存之間也是有?量的數據交互的,所以,兩者必須也?線連起來。不過,我們今天關??組線,叫做地址總線。
32位機器有32根地址總線, 每根線只有兩態,表?0,1【電脈沖有?】,那么 ?根線,就能表?2種含義,2根線就能表?4種含義,依次類推。32根地址線,就能表?2^32種含義,每?種含義都代表?個地址。地址信息被下達給內存,在內存上,就可以找到該地址對應的數據,將數據在通過數據總線傳?CPU內寄存器。
int main()
{
int a = 10;//創建變量的本質是向內存申請一塊空間,為a申請4個字節的空間return 0;
}
指針變量和解應用操作符
int main()
{int a = 10;//&a --- &取地址操作符//& 單目操作符printf("%p\n",&a);return 0;
}
//指針--地址
//指針變量--存放地址的變量int main()
{int a = 10;//&a --- &取地址操作符//& 單目操作符//printf("%p\n",&a);int* p = &a;//p是一個變量(指針變量),是一塊空間//編號-地址-指針//int說明p指向對象是int類型的//*在說明p是指針變量
return 0;
}
int main()
{char ch = 'w';char* pc = &ch;return 0;
}
int main()
{int a =10;int * p= &a;*p =0;//* -解引用操作符(間接訪問操作符)//a =0;】//*&a = 0;//a = 0
printf("%d",a);//0?return 0;
}
指針變量的大小
32位機器假設有32根地址總線,每根地址線出來的電信號轉換成數字信號后是1或者0,那我們把32根地址線產?的2進制序列當做?個地址,那么?個地址就是32個bit位,需要4 個字節才能存儲。
如果指針變量是?來存放地址的,那么指針變的??就得是4個字節的空間才可以。同理64位器,假設有64根地址線,?個地址就是64個?進制位組成的?進制序列,存儲起來就需要8個字節的空間,指針變的??就是8個字節。
指針變量 - 存放地址的? ? ? ? ? ? ? ? ? 地址產生:地址線上傳輸的? ? ? ? ? ? ? ? ? ?32根地址線 ——>地址是:32個0/1組成的二進制序列? ? ? ? ? ? ? ? ? ?要儲存這樣的地址:32bit位的空間 ==4個字節
int main(){printf("%zd\n", sizeof(char *));printf("%zd\n", sizeof(short *));printf("%zd\n", sizeof(int *));printf("%zd\n", sizeof(double *));return 0;}
結論:? 32位平臺下地址是32個bit位,指針變量??是4個字節? 64位平臺下地址是64個bit位,指針變量??是8個字節? 注意指針變量的??和類型是?關的,只要指針類型的變量,在相同的平臺下,??都是相同的。
三、指針變量類型的意義
指針類型決定了指針進行解應用操作符的時候訪問幾個字節,也就是決定指針的權限。
int main()
{ int a = 0x11223344;int * pa = &a;*pa =0;return 0;
}
//代碼1
#include <stdio.h>
int main()
{int n = 0x11223344;int *pi = &n; *pi = 0; return 0;
//代碼2
#include <stdio.h>
int main()
{int n = 0x11223344;char *pc = (char *)&n;*pc = 0;return 0;
}
調試我們可以看到,代碼1會將n的4個字節全部改為0,但是代碼2只是將n的第?個字節改為0。
結論:指針的類型決定了,對指針解引?的時候有多?的權限(?次能操作?個字節)。?如: char* 的指針解引?就只能訪問?個字節,? int* 的指針的解引?就能訪問四個字節。
指針+-整數
int main()
{int a =10;int *pa = &a;char* pc = &a;printf("pa=%p\n",pa);printf("pa+1 = %p\n",pa+1);printf("pc = %p\n",pc);printf("pc+1 = %p\n",pc+1);return 0;
}
指針類型決定了指針進行+1,-1的時候,一次走遠的距離
int * +1 --->走4個字節(整型大小)
char* +1--->走了1個字節(字符大小)