Skip to content

指针

通过指针,可以简化一些 C 编程任务的执行,还有一些任务,如动态内存分配,没有指针是无法执行的。

声明

指针也就是内存地址,使用*表明变量是指针类型。

c
类型标识符 *变量名;
// 这里的`类型标识符`表示指针变量指向的物理地址对应变量的数据类型。

赋值的两种方式:

img.png

注意

*只会在声明时出现一次表示这个变量是指针变量,如果后面再对指针变量使用*,则是取它对应地址下的值。

case:

c
#include <stdio.h>

int main() {
    int var = 10;
    int *p;
    p = &var;
    printf("address: %p\n", &var);
    printf("address: %p\n", p);
    printf("value: %d\n", *p);
    return 0;
}
/*
output:

address: 0x16f3974e8
address: 0x16f3974e8
value: 10
*/

指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:

c
type *var_name;

在这里,type 是指针的基类型,它必须是一个有效的 C 数据类型,var_name 是指针变量的名称。用来声明指针的星号 * 与乘法中使用的星号是相同的。

但是,在这个语句中,星号是用来指定一个变量是指针。所有实际数据类型,不管是整型、浮点型、字符型,还是其他的数据类型,对应指针的值的类型都是一样的,都是一个代表内存地址的长的十六进制数

INFO

如何访问指针对应物理地址的值?

c
*p

如何访问变量对应的物理地址(指针)?

c
&variable

运算

赋值运算

  • 两个指针变量相互赋值
c
int a = 1, *p1 = &a, *p2;
p2 = p1;
  • 将数组的首地址赋值给指针变量
c
int a[2], *p = a;

INFO

为什么可以这样赋值?

根据两个指针类型之间的赋值可知,数组变量名a是一个指针类型,默认指向首个元素。

img.png

  • 将字符串的首字母地址赋值给指向字符类型的指针变量
c
char *p = "hello";

算数运算

指针支持四种算术运算:++--+-

  • 指针的每一次递增,它其实会指向下一个元素的存储单元。
  • 指针的每一次递减,它都会指向前一个元素的存储单元。
  • 指针在递增和递减时跳跃的字节数取决于指针所指向变量数据类型长度,比如 int 就是 4 个字节。

拓展

  1. 对指针的影响都会作用到变量
c
#include <stdio.h>

void add(int *p) {
    *p = 100;
    printf("%d", *p);
}

int main() {
    int a = 1;
    add(&a);
    printf("%d:", a);
    return 0;
}

思维导图

img.pngimg.png