15-指標
記憶體是電腦上特別重要的儲存器,計算機中程式的執行都是在記憶體中進行的 。所以為了有效的使用記憶體,就把記憶體劃分成一個個小的記憶體單元,每個記憶體單元的大小是 1 個位元組。為了能夠有效的訪問到記憶體的每個單元,就給記憶體單元進行了編號,這些編號被稱為該記憶體單元的地址。
【注】記憶體屬於空間!!!
【舉例】記憶體在使用和現實生活中的空間有很多相似的地方。現實生活中想找到一個地方,當描述xxx省xxx市xxx區xxx大學xx樓這樣的地址就能精確的找到一個地方。對於記憶體也是一樣的。記憶體是一個很大的空間。
一、記憶體的編號
【問】記憶體是怎麼編號的?
【答】32 位機器,是指擁有 32 根地址線。而地址線是物理的線,物理的線可以通電,即通正電就是 1,通負電就是 0。此時將電訊號轉換成數字訊號(1 和 0 組成的二進位制序列),這些二進位制序列的編號就被稱為記憶體的地址。同樣 64 位機器,也是一樣。
二、記憶體單元的空間
【問】一個記憶體單元是多大空間?
【答】32 位機器,可以管理 232 個記憶體單元。假設一個記憶體單元是 1 bit,即總共可管理 232 bit = 4,294,967,296bit;4,294,967,296bit / 8 = 536,870,912Byte;536,870,912Byte / 1024 = 524,288KB;524,288KB / 1024 = 512MB;512MB / 1024 = 0.5GB。
【注】最終:一個記憶體單元是一個位元組,然後分配地址的!!!
三、例程
【注】變數所佔的位元組在取地址時,是所佔的位元組的第一個地址!!!
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在記憶體中要分配 4個位元組 的空間 存放 10
printf("%p\n", &a); //%p是列印地址的格式
return 0;
}
四、指標變數
指標變數是用來存放地址的(存放的是別的變數地址)。
1、定義方式
[型別]* [變數1] = &[變數2]
2、&
取址符,用來獲取 [變數2] 的地址。
3、指標變數
*說明 [變數1] 是指標變數。
4、型別
說明 [變數1] 執行的是 [變數2] 的 [型別]。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在記憶體中要分配 4個位元組 的空間 存放 10
/*
* * 說明 pa 是指標變數
* int 說明 pa 執行的物件是 int 型別的
*/
int* pa = &a; //pa 是用來存放地址的,在 C語言 中 pa 叫指標變數
printf("%p\n", pa); //%p是列印地址的格式
char ch = 'w';
char* pc = &ch;
printf("%p\n", pc); //%p是列印地址的格式
return 0;
}
5、*
解引用運算子。
*[變數1] :透過 [變數1] 的地址找到 [變數2],並且獲取或者改變 [變數2] 值。
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在記憶體中要分配 4個位元組 的空間 存放 10
/*
* * 說明 pa 是指標變數
* int 說明 pa 執行的物件是 int 型別的
*/
int* pa = &a; //pa 是用來存放地址的,在 C語言 中 pa 叫指標變數
/*
* * 解引用運算子,*pa 就是透過 pa 裡面的地址,找到 a
*/
*pa = 20;
printf("%d\n", a); //%p是列印地址的格式
return 0;
}
6、例程 & 解析
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
int a = 10; //a 在記憶體中要分配 4個位元組 的空間 存放 10
/*
* * 說明 pa 是指標變數
* int 說明 pa 執行的物件是 int 型別的
*/
int* pa = &a; //pa 是用來存放地址的,在 C語言 中 pa 叫指標變數
*pa = 20;
printf("%d\n", a); //%p是列印地址的格式
return 0;
}
【注】指標就是地址!!!
五、指標變數的大小
指標是用來儲存地址的,指標需要多大空間,取決於地址的儲存需要多大空間。
32位機器 —— 32bit —— 4Byte
64位機器 —— 64bit —— 8Byte
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
int main()
{
printf("%d\n", sizeof(char*)); // 8(位元組)
printf("%d\n", sizeof(short*)); // 8(位元組)
printf("%d\n", sizeof(int*)); // 8(位元組)
printf("%d\n", sizeof(long*)); // 8(位元組)
printf("%d\n", sizeof(long long*)); // 8(位元組)
printf("%d\n", sizeof(float*)); // 8(位元組)
printf("%d\n", sizeof(double*)); // 8(位元組)
printf("%d\n", sizeof(long double*)); // 8(位元組)
return 0;
}