<<C语言深度剖析>>学习笔记之五:指针与数组

 1.指针:

    通俗说法:

    一个基本的数据类型(如char、int、struct)后面加上"*"号就构成了一个指针类型的模子.这个模子是一定的,与"*"号前面的

数据类型无关--在32位系统下是4Byte.也可以理解成PC指针的寻址能力,比如一个32位的SOC,其寻址能力为4G(2^32).如果

不是4Byte(32bit),又怎么可以完全寻址呢?"*"前面的数据类型影响指针的步伐,比如指针加1减1其跨越内存的幅度是以这个

数据类型为单位的.


    1-1.将指定值写入到指定内存地址.

    指针可以理解成和int一样是一种"类型".我们在编程中常常会用到"强制类型转换".比如把一个int型强制转换为char型,如下:

    char cTestVal = (char)iTestVal;

    因此,我们把一个数值也可以强制转换为地址.如:

    0x12ff7c是一个数据.变为一个地址如下:

    (int *)0x12ff7c.

    往内存0x12ff7c地址上写入数值0x100.实现代码如下:

    int *p = (int *)0x12ff7c;

    *p = 0x100;

     也可以直接写成这样:

    *(int *)0x12ff7c = 0x100;


2.数组

    2-1.a,&a[0]和&a区别:

        &a[0]:数组首元素的地址;

        &a:数组的首地址.

        a和&a[0]是一样的.

        二者虽然一样,但是他们的步进值是不一样的.比如&a[0]+1和&a+1.

    示例如下:

#include <stdio.h>

int main(int argc,char **argv)
{
    int a[5]={1,2,3,4,5};

    int *ptr1=(int *)(&a+1);

    printf("%x,%x,%x,%x\n",*(ptr1 - 1),*(a + 1),*(int *)((int)a + 1),*(&a[0] + 1));

    return 0;
}

输出结果:

root@seven-laptop:~/learn/C_Program# ./array 
5,2,2000000,2
root@seven-laptop:~/learn/C_Program# 

对输出结果简析:

&a表示整个数组的起始地址,&a+1表示步进了sizeof(a)的地址空间大小.因此,此时ptrl是指向了数组a末尾再下一个元素的位置.ptrl - 1,指针步进是以其指向类型

为步进值的.ptrl指向int类型.因此ptrl-1表示ptrl再往回退4个byte,落在a的末端最后一个元素位置,输出5.

a和&a[0]都表示数组首元素的地址,a+1是指偏离首元素地址的下一个元素;

*(int *)((int)a + 1):(int)a + 1意思是指元素a[0]的第二个字节.由于是%x格式输出,即从这个地址开始后连续4个字节.下面画出数据在内存存放的示意图:

大端模式:

0 0
0 1 0 0 0 2
小端模式:

1 0 0
0 2 0 0 0

[注]:上述两个表左边表示数组起始位置,地址从左往右越来越高.


小端模式:一个字的高地址存放一个字的高字节.因此,"0 0 0 2"按小端模式规则存放为"2 0 0 0".输出为0x2000000;

大端模式:一个字的高地址存放一个字的低字节.因此,"0 0 1 0"按大端模式规则存放为"0 0 1 0".输出为0x100.


    2-2.数组名作为右值:

        当数组名作为右值时,其意义和&a[0]是一样的,代表的是数组首元素的首地址,而不是数组的首地址.如:

        int array[10];

        int *p = array;

    2-3.数组名不能作为左值:

       

3.指针与数组的关系:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值