1. 程式人生 > >26 指標的本質分析-const int* 與 int* const 解析

26 指標的本質分析-const int* 與 int* const 解析

一、指標基礎

(1)下面的程式輸出什麼?為什麼?

#include <stdio.h>

int main()
{
	int i = 5;
	int *p = &i;
	printf("%d,%p\n", i, p);

	*p = 10;
	printf("%d,%p\n", i, p);

	getchar();
	return 0;
}

輸出:

 結果分析:兩次輸出的 結果相同,說明P的地址相同,即 p 與 i 的地址相同.

(2)* 號的意義:

1 在指標宣告時,*表示所宣告的變數為指標;
2 在指標使用時,*號表示取指標取指標所指向的記憶體空間中的值。

 

(3)小貼士:

例項分析-指標使用示例

#include <stdio.h>

int main()
{
	int i = 0;
	int* pI;
	char* pC;
	float* pF;

	pI = &i;  //指標PI指向i的地址

	*pI = 10;  //將10賦值給i

	printf("%p, %p, %d\n", pI, &i, i);//0027F79C, 0027F79C, 10
	printf("%d, %d, %p\n", sizeof(int*), sizeof(pI), &pI);
	printf("%d, %d, %p\n", sizeof(char*), sizeof(pC), &pC);
	printf("%d, %d, %p\n", sizeof(float*), sizeof(pF), &pF);

	getchar();
	return 0;
}

 輸出:

結果分析:三個指標   int* pI; char* pC; float* pF;  所佔用的位元組都是4,說明指標佔用4個位元組,指標的本質是變數,是變數就會佔用位元組。

二、傳值呼叫與傳值呼叫

程式設計實驗:利用指標變換變數

示例程式碼:

#include <stdio.h>

int swap(int* a, int* b)
{
    int c = *a; //*a代表具體的外部變數aa
    
    *a = *b;
    
    *b = c;
}

int main()
{
    int aa = 1;
    int bb = 2;
    
    printf("aa = %d, bb = %d\n", aa, bb);
    
    swap(&aa, &bb); //傳外部變數的地址
    
    printf("aa = %d, bb = %d\n", aa, bb);
    
    return 0;
}

 輸出:

結果分析: 將外部地址傳入函式:swap(&aa, &bb);   從而*a代表具體的外部變數aa,*b代表具體的外部變數bb,使用int c 作為臨時變數作為交換。

不妨檢視一下記憶體:

①F5除錯,然後 快捷鍵 shift+F9,

 得到c的地址:

 ②同理得到a的記憶體地址:

 ③同理得到b的記憶體地址:

可見,它們將記憶體地址的值作了交換。

 三、常量與指標

例項分析:常量與指標

 #include <stdio.h>

int main()
{
    int i = 0;
    
    const int* p1 = &i;
    int const* p2 = &i;
    int* const p3 = &i;
    const int* const p4 = &i;
    
	//口訣:左數右指
    *p1 = 1;    // compile error  ,p1為常量
    p1 = NULL;  // ok  ,將p1所指的地址變為空
    
    *p2 = 2;    // compile error
    p2 = NULL;  // ok
    
    *p3 = 3;    // ok
    p3 = NULL;  // compile error
    
    *p4 = 4;    // compile error
    p4 = NULL;  // compile error
    
    return 0;
}

 編譯:

結果分析:左數右指

小結:

 

本文為聽課筆記,課程出處: