《學會 C 語言》學習筆記(六):指標

前言

本文為《學會 C 語言》一書的學習筆記。

指標

指標是 C 語言的低階程式處理能力,可以直接存取電腦的記憶體位址。

C 語言的指標是一種變數,只是變數內容不是常數値,而是變數的位址。

在 C 程式誤用指標導致的程式錯誤十分難除錯,需要加倍小心。

宣告指標與初始値

C 語言指標的宣告語法,例如:

1
2
3
4
int *ptr; // 指向 int 的指標宣告
char *ptr1; // 指向 char 的指標宣告
float *ptr2 // 指向 float 的指標宣告
double *ptr3 // 指向 double 的指標宣告

取得位址的變數一定在指標之前已經宣告了。

1
2
int var = 100; // 宣告變數
int *ptr = &var; // 將變數的記憶體位址存給指標

避免存取到未知的記憶體位址,在宣告指標時指定其初値為 NULL

1
int *ptr1 = NULL;

可以使用 if 條件判斷指標是否已經指向其他變數。

1
if (ptr1 == NULL) {...}

指標運算子

C 語言提供兩種指標運算子。

取址運算子

使用 & 取址運算子可以取得運算元變數的位址。

1
ptr = &var;

取値運算子

使用 * 取値運算子可以取得運算元指標的變數値。

1
var = *ptr;

範例如下:

1
2
3
4
5
6
7
8
int var = 55, var1; // 宣告變數
int *ptr = NULL; // 宣告指標
ptr = &var; // 指定指標 ptr 的值
var1 = *ptr; // 取得指標 ptr 的值

// var = 55, &var = 0019FF3C
// ptr = 0019FF3C, &ptr = 0019FF34
// var1 = 55, &var1 = 0019FF38

指標的參數傳遞

C 語言的傳址呼叫就是使用指標。

以下範例找出陣列元素的最大値。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <stdio.h>
#define LEN 5

void maxElement(int *, int *); // 函數的原型宣告

int main()
{
int index, i;
int data[LEN] = {81, 93, 77, 59, 69};

for (i = 0; i < LEN; i++)
printf("[%d:%d] ", i, data[i]);

maxElement(data, &index); // 呼叫函數
printf("\n陣列最大值%d(%d)\n", data[index], index);

return 0;
}

// 函數: 找出陣列的最大值
void maxElement(int *eles, int *index) {
int i, maxValue = 0;

for (i = 0; i < LEN; i++)
if (eles[i] > maxValue) {
maxValue = eles[i]; // 存放陣列最大値用以比較
*index = i; // 更改 index 的値
}
}

指向指標的指標

指向指標的指標是指這個指標指向其他的指標。

範例如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
int var = 25
int *ptr = &var;
int **ptr1 = &ptr;
int ***ptr2 = &ptr1;

// var = 25, &var = 0019FF3C
// ptr = 0019FF3C, &ptr = 0019FF38
// ptr1 = 0019FF38, &ptr1 = 0019FF34
// ptr2 = 0019FF34, &ptr2 = 0019FF30
// *ptr = 25
// *ptr1 = 0019FF3C
// *ptr2 = 0019FF38
// *ptr = 25
// **ptr1 = 25
// ***ptr2 = 25

指標與一維陣列

在 C 程式宣告大小 6 個元素的整數陣列。

1
2
#define LEN 6
int data[LEN] = {11, 93, 45, 27, -40, 80};

在 C 語言,一維陣列的名稱就是指向陣列第一個元素位址的指標常數。

1
2
int *ptr;
ptr = data;

可以使用取址運算子 & 來取得陣列第一個和最後一個元素的位址。

1
2
ptr = &data[0];
ptr1 = &data[LEN - 1];

指標與字串

C 語言的字串就是 char 字串型態的一元陣列,我們可以宣告指標來指向字元陣列或字串常數。

在 C 程式宣告一個一維字元陣列。

1
char str[15] = "This is a pen."

宣告字串指標指向此字串。

1
2
char *ptr;
ptr = str;

也可以宣告字串指標指向字串常數。

1
2
char *ptrl;
ptrl = "This is an apple.";

參考資料

  • 陳會安(2016)。學會 C 語言。台北市:旗標。