【C语言】指针学习总结

1.变量

       我们平时使用的计算机,有一个CPU,有一个内存,CPU仅包含运算逻辑,所有的指令和数据都在内存中,内存仅供存储。

       CPU没有能力直接操作内存里的值,需要从一个特定地址取出数据,对数据进行加工运算,再加工后的数据存入另一个特定地址。

        内存是一个存放数据的空间,内存是按一个字节接着一 个字节的次序进行编号,每个字节都有个编号,我们称编号为内存地址

        当我们声明一个变量 int i = 1; 时,其实是在内存中申请了一个名为i的整型变量宽度的空间,这个空间的编号就是它的地址,空间里的数据为整数1,使用变量就是使用里面的数据。

        用表达式&i表示是取 i 变量所在的地址编号(如:0xff),&为取地址符,即返回 i 变量的地址

2.指针

        1.声明一个指向整型变量i的指针的语句: int *p;p = &i;   p 是一个指针,也是一个变量(指针变量),只不过指针里存储的数据是一个地址(指针是一个存储其指向的变量的地址的变量)。

        可以这样理解:指针变量p的类型为int *,p指向的变量i数据类型为int,*p类型为int,使用*p就是使用变量i,*为取值符。CPU通过操作地址来操作内存空间里的数据,我们通过指针变量(即地址)来操作内存空间里的变量(即数据)

        指针本⾝也是⼀个变量,所以指针也是有⾃⼰的地址,但是这个变量有点特殊,存放的是另⼀个变量的地址。

        指针2个层次:

        指针⾸先是⼀个变量,他就拥有变量的所有属性:值和类型。它的类型是指针,值就是另⼀个变量的地址。指针变量也需要内存空间,存放其他变量的地址

        指针变量存储哪个变量的地址,就表示指向对应的变量的空间

        2.指针的运算,对指针变量(指针变量存储的数据(数据是地址))进⾏运算

         p表⽰指针变量

         +(加法): p + n:

        指针p向地址增⼤的⽅向移动n个数据(指针指向的数据类型)大小的地址 如: int * p = 0x10; p + 5 == 0x10 + sizoef(int)*5 = 0x10 + 0x14 == 0x24

        -(减法): p - n:

        指针p向地址减小方向移动n个数据大小的地址 如: double * p = 0x30; p - 3 = 0x30 - 3*sizeof(double) = 0x30 - 0x18 = 0x18

        特殊: p1 - p2:

        指针减指针,指两个地址间间隔多少个数据 如: double * p1 = 0x10, *p2 = 0x20; p2 - p1 = (0x20 - 0x10)/sizeof(double) = 0x10 / 8 = 2

        *(乘法): p * n---错误

        /(除法): p / n---错误

        ++:

        p++: 先使⽤指针变量p,然后 p = p + 1,向地址增大方向移动⼀个数据类型大小,地址存储到p中         

        ++px:先 px = px+1,向地址增⼤⽅向移动⼀个数据类型⼤⼩地址存储到px 中,然后再使⽤px指针

        3.指针与数组

        数组:在内存中,数组的数据元素是⼀段连续的空间,在这段空间中每 个元素占⽤对应的大小,元素与元素之间相连

        访问数组,就可以使⽤指针。

         a[0]和a[1]数据地址是连续的(在存储是时挨在⼀起的),相隔就是⼀个数据大小(a[0])。

         指针p = &a[0]        指针访问:*p, *(p+1)

        由于数组的数据元素是连续的,元素地址是相邻的,只要有⼀个指针存储了数组元素的地址,就可以指针运算(+、-)可以得到数组其他元素的地址

        如: p = &a[0]    p+1 == &a[1]     p+3 == &a[3]

        只要知道数组的第⼀个元素的地址,就可以通过地址(指针)遍历整个数组

        数组第⼀个元素地址------数组首地址(数组起始地址)

         对于数组而言:数组名就是数组的首地址---第⼀个元素地址

        int a[5];

        数组名+ n (a + n):移动n个数组元素大小的地址

        *(地址):取出地址中的数据(取出数组元素)

        数组首地址 + n(&a[0] + n):可以偏移搭到数组的每个元素的地址

         *(数组名 + n) :访问到数组每个元素 === 数组名[n] 如: *(a+2) == a[2]

        指针变量存储地址,可以存储数组首地址 int * p = a; //&a[0] p+n == a+n

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值