C[7] 指针(pointer)


C[7] 指针(pointer)

1、概念

对于指针的描述,很多资料描述的摸棱两可,理解起来过于的复杂,这里加上自己对指针概念的理解,

指针(pointer)是指向对象变量的内存地址,是内存地址,是变量的内存地址,是函数的入口地址。计算机按变量的地址取出其内容,并按变量的地址将计算结果存入到变量占据的内存中。

指针变量 是用来存放内存地址的变量,在同一CPU构架下,不同类型的指针变量所占用的存储单元长度是相同的,而存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。有了指针以后,不仅可以对数据本身,也可以对存储数据的变量地址进行操作。 
指针描述了数据在内存中的位置,标示了一个占据存储空间的实体,在这一段空间起始位置的相对距离值。在 C/C++语言中,指针一般被认为是指针变量,指针变量的内容存储的是其指向的对象的首地址,指向的对象可以是变量(指针变量也是变量),数组,函数等占据存储空间的实体。

这里重点理解一下:指针即指向的变量和指针变量,两个概念。

2、示例:

#include <stdio.h>

int main()
{
    //滔Roy 2021.11.05
    //测试环境:win10 64
    int i = 10;  //编译器为i分配一个变量地址,这个变量地址代表一个存储空间,空间中存储的数据的类型是int ,存储空间写入变量的值10
    int *p;   // 定义指针   Delphi写法: var p:^Interger;  
    p = &i;   // 将i的内存地址分配给指针变量p    Delphi写法:p:=@i
    //以上两句,也可以写成: int *p=&i;

    //16 进制输出
    printf("i 变量的值: %p\n", i);       //000000000000000A      //i的内存值
    printf("i 变量的地址: %p\n", &i);    //000000000061FE1C      //i的内存值地址,这个地址根据系统运行分配可能不一样,它仅代表分配的一个内存地址        printf("i 变量的地址: %x\n", &i);   //61fe14     //i的内存值地址
    printf("p 变量的值: %p\n", p);       //000000000061FE1C      //p变量的值指向(等于)i的内存值地址
    printf("p 变量的地址: %p\n", &p);    //000000000061FE10      //p变量也有一个内存值地址 , 这个一般不用,不用理会,只是输出对比
    printf("p 变量的指针值*p: %p\n", *p);//000000000000000A      //p变量的指针值等于i的值,  即*p等同于i

    //10 进制输出
    printf("i 变量的值: %d\n", i);      //10 = A (16进制)         //i存储空间的值=10
    printf("i 变量的地址: %d\n", &i);   //6422044 = 61FE1C
    printf("p 变量的值: %d\n", p);      //6422044 = 61FE1C         //p存储空间的值是 i的变量地址
    printf("p 变量的地址: %d\n", &p);   //6422032 = 61FE10
    printf("p 变量的指针值: %d\n", *p);   //10 = A

    *p=*p+1;   //改变指针的值,即改变了i的值
    printf("*p 变量的值: %d\n", *p);   //11
    printf("i 变量的值: %d\n", i);     //11
    printf("p 变量的值: %d\n", p);     //6422044 = 61FE1C    指针变量的值不变

    i=i+1;  //改变i的值,指针的值也改变,因为指针指向了这个地址,这个地址的值改变,它也改变
    printf("i 变量的值: %d\n", i);     //12
    printf("*p 变量的值: %d\n", *p);   //12
    printf("p 变量的值: %d\n", p);     //6422044 = 61FE1C    指针变量的值不变

    p=p+1;
    printf("p 变量的值: %d\n", p);   //6422048=61FE20      //指针变量的值改变
    printf("i 变量的值: %d\n", i);   //12                  //改变指针变量的值,不会改变i的值,因为指针变量存储的是变量的地址。
    printf("*p 变量的值: %d\n", *p);   //12854240  //改变指针变量,即指针的值也改变. 应该是个随机值,每次运行都一样 ,也可能是 0

    //sizeof()  返回变量的大小。 注意:C语言中的sizeof() 不是函数,相当于运算符。
    printf("i 变量的大小: %d\n", sizeof(i));   //4   i是int类型,值占用4个字节
    printf("i 变量的大小: %d\n", sizeof(&i));  //8

    printf("p 变量的大小: %d\n", sizeof(p));    //8  //同一CPU下,不同类型的指针变量所占用的存储单元长度是相同的
    printf("*p 变量的大小: %d\n", sizeof(*p));  //4   指针指向i的值,大小与i一致。存放数据的变量因数据的类型不同,所占用的存储空间长度也不同。
    printf("&p 变量的大小: %d\n", sizeof(&p));  //8

}  

3、空指针和判断

#include <stdio.h>

int main()
{
// 滔Roy 2021.11.05
    int *p;  p=NULL;  //可以写成: int *p=NULL;    //指针设置成空值,不会改变原来指针变量p的内存地址

    printf("p 的地址是 %p\n", p );  //0000000000000000
    printf("*p 指针的大小 %d \n", sizeof(*p));  //4
    printf("p 变量的大小 %d \n", sizeof(p));   //8

    if (p)   //注意:这里的判断相当于 p是否等于1 ,即不为空,  如果是: if (!p)  即不等于1 ,即为0 ,即为空
    {
        printf("p指针不为空");
    } else
    {
        printf("p指针为空");
    }
}

 

 

 

 

创建时间:2021.11.04  更新时间:


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM