26 指標的本質分析-const int* 與 int* const 解析
阿新 • • 發佈:2018-12-17
一、指標基礎
(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;
}
編譯:
結果分析:左數右指
小結:
本文為聽課筆記,課程出處: