C语言指针超详细知识点(一) 速速码住!!!

        指针是C语言至关重要的一部分,相信有很多同学对于本部分知识有许多不明白的地方,但是,相信你认真阅读并思考本篇文章所涉及的知识后,一定能有更深的理解与感悟。

一.内存与地址

1.内存与编址

        中央处理器(cpu)在处理数据时,需要的数据是从内存中读取的,处理后的数据也是存放在内存中,那这些内存空间是如何被合理规划的呢?

        其实就是把内存划分为一个个内存单元,而每个内存单元的大小为一个字节。每个内存单元都有一个编号,而cpu则可以根据这个编号找到相应的内存空间,我们可以把这个内存空间称为地址,而在C语言中,它有一个新的名字——指针

        那么,我们如何理解编号与地址呢?这时候我们需要介绍一组线——地址总线。CPU与内存之间的数据如果要进行传递,必须用“线”连接起来,而地址总线恰好可以承担这个任务。我们举个例子,例如32位机器有32根地址总线,每根线可以发出1或0两种脉冲,因此32位机器发出2^32种含义的脉冲,每一种代表一个地址。

二.指针变量与地址

1.取地址操作符 &

在C语言中,创建变量就是向内存申请空间,而我们可以通过取地址操作符&,取出我们所需要的地址。

需要注意的是,我们所打印出来的是第一个字节的地址,而整型占四个字节,我们可以顺藤摸瓜找到四个字节的数据。

2.指针变量和解引用操作符

看下面这个例子,当我们看到int*pa,我们需要知道的是,*代表pa是指针变量,int代表指针变量pa指向的是整型类型的对象:

                        int a=4;

                        int *pa=&a;

我们通过指针变量保存了对象的地址后,当我们需要用到这个对象时,该如何解引用指针变量呢?这时就需要用到解引用操作符*:

                        int a=4;

                        int *pa=&a;

                        *pa=0;

这时我们就通过解引用将a的值更改。

3.指针变量的大小

前面我们已经说到过,在32位机器中,有32根地址总线,每条总线发出1或0的脉冲,那么一个地址就拥有32个bit位,需要4个字节才能存储,因此在32位机器下,指针的大小为四个字节,以此类推,在64位机器下,指针的大小就是8个字节。

因此需要注意:指针变量大小与类型无关只要为指针,不论是字符型指针,还是整型指针,只要在相同的平台,大小都是一样的。

三.指针变量类型的意义

1.指针的解引用

上文说到指针变量的大小与类型无关,但是指针变量类型却有他存在的独特意义。

指针的类型决定了对指针解引用时有多大的权限,也就是一次能操作几个字节。

例如,char*指针解引用时只能访问一个字节,而int*可以访问四个字节。

2.指针+-整数

我们来看一段代码:

   由此可以看出,指针类型决定了加减整数时移动的步长有多大。

3.void*指针

void*类型的指针可以理解为无具体类型的指针,这种指针可以用来接收任意类型的对象,但是它也有局限性,void*指针不可以解引用,也不可以进行加减整数的运算。

四.const修饰指针

由上面的程序我们可以得出以下结论:

当const放在*左面时,指针变量可以被更改,但是指针指向的内容不可以通过指针被更改;

当const放在*右面时,指针变量不可以被更改,但是指针指向的内容可以通过指针被更改。

五.指针运算

指针的基本运算有三种:

        (1).指针+-整数

         (2).指针-指针

        (3). 指针的关系运算

1.指针+-整数

指针在数组中是连续存放的,当我们知道第一个元素的地址后,可以通过指针+-整数来找到其他元素的地址。例如:

2.指针-指针

指针-指针用来表示两个地址间相差的元素的个数(仅适用于位于同一块空间的指针)。

指针-指针可以用来模拟strlen函数的实现:

3.指针的关系运算

在这个程序中,两个指针进行了大小的比较。

关于指针(一)的讲解就到这里了,感谢大家的阅读,如有错误,感谢指正,我们下文再会!

           

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值