文章程式碼顯示

2018年2月12日 星期一

《筆記》C語言 - 07_4:霧颯颯? 指標與 const 、 int & xPtr、int* const xPtr 、 const int* const xPtr 差別

int* xPtr

#include "stdio.h"

int main(void) {

 int x = 10;
 int y = 20;
 int* xPtr; // xPter 是一個指標變數

 printf("x = %d (%p)\n", x, &x);
 printf("y = %d (%p)\n\n", y, &y);

 xPtr = &x; // xPtr 這個指標變數,指向 x (&x為 取出x得地址);或說 xPtr 存放 x 的地址
 *xPtr = 33; // 由 xPtr 修改變數 x

 printf("x = %d (%p)\n", x, &x); // 修改後的 x
 printf("xPtr = %x, *xPtr = %d\n", xPtr, *xPtr); // xPtr 存放 x 的位址

 xPtr = &y; // xPtr 改指向 y
 printf("x = %d (%p)\n", x, &x); // 目前 x 的值以及地址
 printf("xPtr = %x, *xPtr = %d", xPtr, *xPtr); // xPtr 變成指向變數 y

}


指標本身可以更改使其指向的位址,並且可以藉由 *(米字號) 對該變數間接賦値

int* const xPtr 常數指標

#include "stdio.h"

int main(void) {

 int x = 10;
 int* const xPtr = &x;

 printf("x = %d (%p)\n", x, &x); // 印出變數存放的值,以及其地址

 *xPtr = 33; // 由 xPtr 修改變數 x 存放的值

 printf("x = %d (%p)\n", x, &x); // 修改後的 x 及其地址
 printf("xPtr = %x, *xPtr = %d\n", xPtr, *xPtr); // xPtr 存放 x 的位址

}




使用 int* const xPtr 進行一個 "指標常數變數" 宣告

因為指標常數本身被設置為 const ,所以在編譯前就必須對該指標變數指向哪個位址進行指定

int* const xPtr 常數指標指向的位址不得進行修改

#include "stdio.h"

int main(void) {

 int x = 10;
 int y = 20;
 int* const xPtr = &x;

 printf("x = %d (%p)\n", x, &x);
 printf("y = %d (%p)\n\n", y, &y);

 *xPtr = 33; // 由 xPtr 修改變數 x

 printf("x = %d (%p)\n", x, &x); // 修改後的 x
 printf("xPtr = %x, *xPtr = %d\n", xPtr, *xPtr); // xPtr 存放 x 的位址

 xPtr = &y; // xPtr 改指向 y
 printf("x = %d (%p)\n", x, &x); // 目前 x 的?以及 位址
 printf("xPtr = %x, *xPtr = %d", xPtr, *xPtr); // xPtr 變成指向變數 y

}




第 17 行的地方報錯,因為我們嘗試將 xPtr 改指向 y

但 xPtr 本身被設置為 const

這種 "指定的位址" 被定死的寫法,就跟陣列名稱一樣

陣列名稱就是一個常數指標的代表


const int* xPtr 指標指向常數變數,不得進行利用指標進行間接修改

#include "stdio.h"

int main(void) {

 int x = 10;
 const int* xPtr = &x;

 printf("x = %d (%p)\n", x, &x);

 x = 20; // x 仍可以直接由賦值運算子(=)進行值的修改
 printf("x = %d (%p)\n", x, &x);

 *xPtr = 33; // 但不能藉由指標進行間接修改
 printf("x = %d (%p)\n", x, &x);
 printf("xPtr = %p, *xPtr = %d\n", xPtr, *xPtr);

}



const int* const xPtr 表示"指向的位址"以及"指向的值"都定義為一個常數變量,皆不得在程式中進行修改

#include "stdio.h"

int main(void) {

 int x = 10;
 int y = 15;
 const int* const xPtr = &x;

 printf("x = %d (%p)\n", x, &x);
 printf("xPtr = %x, *xPtr = %d", xPtr, *xPtr); 

 *xPtr = 33; //企圖由 xPtr 修改變數 x 的值
 xPtr = &y; // 企圖更改 xPtr 指向的位址

}



總結

我們總共講了四大種類,分別是

1. int * xPtr
最普通的應用
xPtr 是一個指標變數,指向 int型

2. int* const xPtr
xPtr 是一個常數指標變數,指向 int型
指標本身指向哪個位址不得進行更改

3. const int* xPtr
xPtr 是一個指標變數,指向常數 int型
指向的該變量之值不得使用 *(米字號) 進行修改

4. const int* const xPtr
xPtr 是一個常數指標變數,指向常數 int型
指向的該變量不得使用 *(米字號) 進行修改;且指標指向哪個位址亦不得進行更改

↓↓↓ 連結到部落格方針與索引 ↓↓↓

Blog 使用方針與索引