C语言指针

地址、变量、指针基本概念

地址:在计算机内存中,每个字节单元都有一个唯一的编号,这个编号称为地址。这些地址通常是连续的,允许程序在需要时访问和操作特定的内存单元。
变量:变量是编程语言中用于存储数据的基本单位。在编译或函数调用时,编译器或解释器会为这些变量分配适当大小的内存单元,用于存储其对应的数据。
指针:在C语言中,内存单元的地址被称为指针。指针是专门用来存放内存地址的变量,在编程中用来处理内存地址。指针变量是用来存储内存地址的变量,它们可以用于访问和操作内存中的数据。在不影响理解的情况下,有时可以将地址、指针、指针变量统称为指针。

指针变量的说明

指针变量是用来存储内存地址的变量,它指向内存中的特定数据。一般情况下,指针变量的声明遵循以下形式:

<存储类型><数据类型>*<指针变量名>;
例如,char *pName; 表明了一个指向字符型数据的指针变量。

指针的存储类型是指指针变量本身在内存中的存储方式,它由声明时的存储类型决定。而声明指针时指定的数据类型是指针所指向的数据类型,通常称为指针的数据目标。换句话说,指针的数据目标表示指针所指向的内存中存储的特定数据类型。

指针目标及指针目标变量说明
指针指向的内存区域中的数据被称为指针的目标。
如果指针指向的区域是程序中的某个变量所占用的内存空间时,则该变量被称为指针的目标变量,简称为指针的目标变量

image.png
image.png

指针的不同表达含义

在使用指针时,需要注意三种表示方法的不同含义:px、*px和&px。假设px是一个指针变量:

  • px:指针变量本身,其内容是一个地址量。
  • *px:指针所指向的对象,其内容是实际的数据。
  • &px:指针变量所占用的存储区域的地址,是一个常量。

理解并区分这些表示方法有助于正确操作指针以及对内存的访问和处理。
image.png

指针的赋值运算

指针赋值运算是通过赋值运算符将一个地址值赋给指针变量。在指针赋值过程中,赋予的值必须是地址常量或指针变量,而不能是普通的整数(除了赋值0意外)。
指针赋值运算通常有以下几种形式:
把一个普通变量的地址赋给一个具有相同数据类型的指针:

double x = 15;
double *px;
px = &x;

把一个已有地址值的指针变量赋给具有相同数据类型的另一个指针变量:

float a, *px, *py;
px = &a;
py = px;

指针关系运算

指针之间的关系运算代表了它们所指向的内存地址之间的关系。当一个指针所指向的地址比另一个指针所指向的地址大时,我们认为指向较大地址的指针大于指向较小地址的指针。
对于指针和普通整数变量之间的关系运算,通常没有明确的语义。然而,我们可以将指针与零进行比较,以确定该指针是否为空(即指向了无效的地址)。这种操作可以帮助判断指针是否为NULL。

总结与思考:什么叫指针?指针占几个字节?

指针是一种变量,其值为内存地址。它指向内存中存储的数据,允许直接访问或操作内存中的数据。通过指针,可以实现对内存的动态管理,以及在程序中传递复杂数据结构的能力。在C及类似的编程语言中,指针提供了对内存的底层访问,使得程序能够更加灵活和高效地操作内存。
指针的大小取决于计算机架构和操作系统。在32位系统中,指针一般占用4个字节(32位),而在64位系统中,指针通常占用8个字节(64位)。这是因为指针需要存储一个内存地址,而内存地址的长度与系统的寻址能力有关。因此,不同的系统架构会影响指针变量的字节大小。

#include <stdio.h>

int main() {
    int a = 10;
    int *p;
    int *q;

    p = &a; // 将p指向a的地址
    q = p; // 将q指向p指向的地址,也就是a的地址,等价于q=&a

    printf("&p: %p %lu\n", &p, sizeof(p)); // 输出指针p的地址和大小
    printf("%p %p\n", p, &a); // 输出p所指向的地址和a的地址
    printf("%p %d\n", &a, *p); // 输出a的地址和p所指向的值

    printf("\n\n&q: %p %lu\n", &q, sizeof(q)); // 输出q的地址和大小
    printf("%p %d\n", q, *q); // 输出q所指向的地址和q所指向地址的值
    return 0;
}

int main()
{
    double a;
    double *p;

    int b;
    int q;

    p=&a;
	q=&b;

    pritf("%p %p\n",p,&a);
    pritf("%p %p\n",q,&b);

    return 0;
}
  • 6
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值