15-指標

AK47YHAO發表於2024-12-06

15-指標

記憶體是電腦上特別重要的儲存器,計算機中程式的執行都是在記憶體中進行的 。所以為了有效的使用記憶體,就把記憶體劃分成一個個小的記憶體單元每個記憶體單元大小1 個位元組為了能夠有效的訪問記憶體的每個單元,就給記憶體單元進行了編號這些編號該記憶體單元地址

【注】記憶體屬於空間!!!

【舉例】記憶體使用現實生活中的空間有很多相似的地方。現實生活中一個地方,當描述xxx省xxx市xxx區xxx大學xx樓這樣的地址能精確找到一個地方。對於記憶體也一樣的。記憶體是一個很大的空間。

image-20241206113718671

一、記憶體的編號

【問】記憶體怎麼編號的?

【答】32 位機器,是擁有 32 根地址線。而地址線是物理的線物理線可通電,即通正電就是 1,通負電就是 0。此時將電訊號轉換成數字訊號1 和 0 組成的二進位制序列),這些二進位制序列編號就被稱為記憶體的地址。同樣 64 位機器,也是一樣

image-20241206134332759

二、記憶體單元的空間

【問】一個記憶體單元多大空間?

【答】32 位機器,可以管理 232 個記憶體單元。假設一個記憶體單元1 bit,即總共可管理 232 bit = 4,294,967,296bit4,294,967,296bit / 8 = 536,870,912Byte536,870,912Byte / 1024 = 524,288KB524,288KB / 1024 = 512MB512MB / 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;
}

image-20241206144529121

四、指標變數

指標變數是用來存放地址的(存放的是別的變數地址)。

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;
}

image-20241206151007793

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;
}

image-20241206152647989

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;
}

image-20241206160134136

image-20241206155756308

【注】指標就是地址!!!

五、指標變數的大小

指標是用來儲存地址的,指標需要多大空間取決地址的儲存需要多大空間

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;
}

image-20241206165837855

相關文章