在 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