C语言指针详解

本文详细介绍了C语言中的指针,包括基本概念、指针变量的定义与使用、野指针与空指针的区别、void *万能指针的作用,以及const修饰指针的各种情况。还探讨了指针与数组、函数的交互,如数组名的内存表示、指针操作数组元素及指针作为函数参数和返回值的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前言:指针作为 C 语言中的精髓,也是最难的一部分内容,只要理解指针与内存之间的关系,也许你会有一个新的认识。

指针的基本概念

首先先看下指针的概念(摘自百度):

指针是一个占据存储空间的实体在这一段空间起始位置的相对距离值。在C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

通俗的来说就是:

  • 内存区的每一个字节都有一个编号,这就是“地址”。
  • 如果在程序中定义了一个变量,在对程序进行编译或运行时,系统就会给这个变量分配内存单元,并确定它的内存地址(编号)
  • 指针的实质就是内存“地址”。指针就是地址,地址就是指针。
  • 指针是内存单元的编号,指针变量是存放地址的变量。
  • 通常我们叙述时会把指针变量简称为指针,实际他们含义并不一样。

普通变量对应内存存储情况

不同的类型的数据占用的字节数不同,例如 int 占用 4 个字节,char 占用 1 个字节。
在这里插入图片描述
指针变量对应内存存储情况

指针存储的值是内存地址,且占用的字节数都是不会变的,在 32 位操作系统下是 4 个字节,64 位操作系统下是 8 个字节。
在这里插入图片描述

指针变量的定义和使用

  • 指针也是一种数据类型,指针变量也是一种变量
  • 指针变量指向谁,就把谁的地址赋值给指针变量
  • “*”操作符操作的是指针变量指向的内存空间

先看一段代码

#include <stdio.h>

int main() {

    // 定义整型变量a
    int a = 10;

    // 定义指针变量p
    int *p;

    // 指针变量赋值,指针变量p指向变量a的地址
    p = &a;

    printf("%p\n", &a); // 000000000061FE14(a变量的内存地址)
    printf("%p\n", p);  // 000000000061FE14(p变量存储的指针值)
    printf("%p\n", &p); // 000000000061FE10(p变量的内存地址)

    printf("%d\n", a); // 10(a变量存储的值)
    printf("%d\n", *p); // 10(通过*操作指针变量指向的内存)

    printf("%d\n", sizeof(a)); // 4(int类型占用内存的大小)
    printf("%d\n", sizeof(p)); // 8(指针类型占用内存的大小,32位操作系统下是4个字节,64位操作系统下是8个字节)

    return 0;
}

以上代码对应的内存存储情况
在这里插入图片描述
总结

  1. p 存放的值 = a 的内存地址,也就是说 p 存储的是 a 的内存地址;
  2. 通过 * 操作指针变量指向的内存的值,也就是说 *p 取出来的是 a 存放的值。

& 是取地址符号,是升维度的。
* 是取值符号,是降维度的。

野指针和空指针

野指针:指针变

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值