指针简单介绍

本文详细介绍了C语言中内存单元、地址、指针及其操作,包括取地址、指针变量的使用、不同类型的指针(如int*与char*)以及特殊指针如void*和const的含义。
摘要由CSDN通过智能技术生成

一、内存、地址与指针

        计算机中的内存被划为一个个的内存单元,每个内存单元大小为一个字节。而每个内存单元都有其各自的编号,即为地址。在C语言中,地址又被称为指针。

        CPU与内存之间通过各种线进行数据交互,其中有一组线叫作地址总线。计算机有32位与64位之分,32位机器有32根地址总线,而64位机器有64根。每根地址总线有0和1两种状态,相互组合在一起即可表示一个地址。

二、指针变量与地址

1、取地址操作符(&)

        在C语言中,创建变量即向内存申请空间,  例如int a = 10,即向内存申请4个字节的空间用以存放10这个整数。而&(取地址操作符)作用为取到变量的地址,例如&a取出的是a所占4个字节中地址较小的字节的地址。

2、指针变量

(1)介绍

        指针变量是一种专门用来存放地址的变量,存放在指针变量中的值都会被理解为地址。

(2)书写方式

int a=0;
int* pa =&a;

 分析:    1、pa即为指针变量,其类型为int*

                2、int表示pa指向的为int类型的对象,*表示pa为指针变量;

                3、pa的内容为a的地址,且pa也有其自己的地址,用&pa读取;

(3)解引用操作符(*)

        用指针变量存放地址,代表会用到这个地址,而使用的方式就是通过解引用操作符(*)。

        例如:*pa意为通过pa中的地址,找到对应的空间,此时*pa即为变量a。

int main()
{
    int a = 100;
    int* pa = &a;
    *pa = 0;//a此时为0
    return 0;
}

(4)指针变量的大小

        每根地址总线发出来的电信号有0与1两种,占1个比特位,故32位机器的一个地址占32个比特位,即4个字节,64位机器则为8个字节。

        所以说,指针变量的大小取决于32位还是64位,但这并不意味指针变量的类型没有意义。

(5)指针变量类型的意义

        int*与char*的区别在于对指针解引用的权限大小,char*只可访问一个字节,而int*可以访问四个字节。

(6)指针+-整数

#include<stdio.h>
int main()
{
    int n = 0;
    char* p = (char*)&n;
    int* pa = &n;
    printf("%p %p \n",p,p+1);
    printf("%p %p",pa,pa+1);
    return 0;
}

结果:

        可以看到char*可以一次跳过1个字节,int* 可以一次跳过4个字节,由此可以看到指针类型决定指针移动的大小。

三、特殊指针

1、void*指针

        void*指针,可以理解为无具体类型的指针,可以用来接收任意类型的地址,但由于没有具体的类型,导致其无法解引用和+-整数(无法判断其有占据个字节)。

        合理运用void*可以用来接收不同类型数据的地址,可以借此实现泛式编程。

2、const修饰指针变量

int a = 0;
const int* p = &a;
int* const pa = &a;

        const在*的左边时,修饰的为指针指向的内容,保证*p不可改变,但p可以改变;

        const在*的右边时,修饰的为指针变量本身,保证pa不可改变,但*pa可以改变;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值