在 C 語言中使用指標 & 符號

Jinku Hu 2023年1月30日 2021年1月22日
  1. 使用&var 符號獲取給定變數的地址
  2. 使用*ptr 符號從指標訪問變數的值
  3. 使用&符號向函式傳遞物件的地址
在 C 語言中使用指標 & 符號

本文將介紹在 C 語言中如何使用指標 & 符號的多種方法。

使用&var 符號獲取給定變數的地址

指標只是持有記憶體地址的變數。它們用 type *var 符號來宣告。指標可以被分配給任何相同型別的地址,任何指標型別都可以儲存 void*指標,它被稱為通用指標。既然我們有一個儲存物件地址的型別,就應該有一個操作符提供對一個物件的訪問。

&作為一元運算子,通常被稱為取址運算子。它可以用於資料物件和函式上,以檢索物件的儲存地址。

假設我們宣告並初始化了一個整數 x,如下例所示。在這種情況下,我們可以用取址運算子&取其地址,並將其分配給 int *xptr 變數。因此,xptr 指向的值是 10233,在後續的程式碼中可以利用運算子*來訪問它的值。

注意,星號*在這裡有兩種不同的情況下使用。一個是宣告一個指標型別的變數。另一個是用來從指標訪問變數的值,後一種情況叫做去引用。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int x = 10233;
    int *xptr = &x ; // xptr now points to x

    printf("x: %d\n", x);
    printf("*xptr: %d\n", *xptr);

    exit(EXIT_SUCCESS);
}

輸出:

x: 10233
*xptr: 10233

使用*ptr 符號從指標訪問變數的值

可以利用去引用操作符從指標中獲取值,並將它們分配給相同型別的變數。請注意,*操作符不能用於 null 或無效指標,因為它會導致未定義的行為。在大多數情況下,如果嘗試使用 null 指標,程式很可能會崩潰。但如果訪問無效指標,可能會被忽略。無效指標可能指向記憶體中的某個任意物件,對它的操作仍然會進行,但它可能會破壞程式狀態的正確性。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int x = 10233;
    int *xptr = &x ; // xptr now points to x

    int y = *xptr ; // y now holds the value 10233
    printf("x: %d\n", x);
    printf("y: %d\n", y);

    exit(EXIT_SUCCESS);
}

輸出:

x: 10233
y: 10233

使用&符號向函式傳遞物件的地址

利用取址運算子的最常見的例子是傳遞一個指向物件的指標作為函式引數。下面的例子演示了 swap 函式,它將兩個整數指標作為引數。請注意,當從 main 函式中呼叫 swap 時,使用了&運算子來傳遞 xy 變數的地址。不過請注意,swap 函式主體中的*運算子表示指標的去引用。

#include <stdio.h>
#include <stdlib.h>

void swap(int *x, int *y)
{
    int tmp = *x;
    *x = *y;
    *y = tmp;
}

int main() {
    int x = 10233;
    int y = 10133;

    printf("x:%d, y:%d\n", x, y);
    swap(&x, &y);
    printf("x:%d, y:%d\n", x, y);

    exit(EXIT_SUCCESS);
}

輸出:

x:10233, y:10133
x:10133, y:10233
Author: Jinku Hu
Jinku Hu avatar Jinku Hu avatar

Founder of DelftStack.com. Jinku has worked in the robotics and automotive industries for over 8 years. He sharpened his coding skills when he needed to do the automatic testing, data collection from remote servers and report creation from the endurance test. He is from an electrical/electronics engineering background but has expanded his interest to embedded electronics, embedded programming and front-/back-end programming.

LinkedIn

相關文章 - C Pointer