美文网首页
c语言指针

c语言指针

作者: 温岭夹糕 | 来源:发表于2020-03-30 09:28 被阅读0次

    参考c语言中文网:http://c.biancheng.net/view/1990.html

    计算机中所有的数据都必须放在内存中,不同类型的数据占用字节数不同,为了正确地访问或找到这些数据,必须为每个字节都编上号码(采用16进制),每个字节的编号都是唯一的,像身份证一样

    我们将内存中字节的编号称为地址或指针

    数据在内存中的地址也称为指针,如果一个变量存储了一份数据的指针,我们就称它为指针变量。

    以%#X或%p形式来输出&变量的地址。

    C语言用变量来存储数据用函数来定义一段可以重复使用的代码,它们最终都要放到内存中才能供 CPU 使用

    变量->数据

    函数->代码

    指针 == 16进制编号

    数据和代码都以二进制的形式存储在内存中,计算机无法从格式上区分某块内存到底存储的是数据还是代码。当程序被加载到内存后,操作系统会给不同的内存块指定不同的权限,拥有读取和执行权限的内存块就是代码,而拥有读取和写入权限(也可能只有读取权限)的内存块就是数据

    CPU 只能通过地址来取得内存中的代码和数据,程序在执行过程中会告知 CPU 要执行的代码以及要读写的数据的地址。

    CPU 访问内存时需要的是地址,而不是变量名和函数名!变量名和函数名只是地址的一种助记符,当源文件被编译和链接成可执行程序后,它们都会被替换成地址。编译和链接过程的一项重要任务就是找到这些名称所对应的地址。

    *称为指针运算符,既用来定义一个指针变量(用来区分普通变量)也用来取得某个地址上的数据(取值)

    int a=100; // a的地址为0x1000

    int *p=&a; // p的值为0x1000,此时为定义

    printf("%d\n",*p);

     //表示对该地址取值 即 *p == a 为true


    关于指针(编号)的加减

    对地址的加减涉及到定义指针变量时的变量类型

    int a=100 ,*p = &a;

    printf("%p\n",p); //地址为0x1000

    p++;  //  p++  != *p++

    printf("%p\n",p); //地址为0x1004

    因为int占4个字节,对整型变量指针+1就为跳过4个字节


    数组的特殊性

    数组在内存中一块连续的内存,数组名就是指针?

    (数组等价于指针,这是不完全正确的,但大多数情况下可以这样认为)

    它指向数组的第0个元素

    int a[] = {1,2,3}

    printf("%p  %p\n",a,&a[0])

    注: int  *p = a ;等价于 int *p = &a[0]

    借由这个特性我们可以推导出对数组名+1就是让指针向后移动一位

    printf("%d\n",*(a+1)); // *表示对地址取值,此时为a[1]

    相关文章

      网友评论

          本文标题:c语言指针

          本文链接:https://www.haomeiwen.com/subject/pwgpthtx.html