C语言

作者: 41c48b8df394 | 来源:发表于2018-12-11 00:01 被阅读8次

    地址与指针

    地址

    在内存(注意,我们这里提到的内存并不是人们常说的计算机的物理内存,而是虚拟的逻辑内存空间)当中,简单点说:地址就是可以唯一标识某一点的一个编号,即一个数字!我们都见过尺子,我们同意以毫米为单位,一把长1000毫米的尺子,其范围区间为0~999,而我们可以精确的找到35毫米,256毫米处的位置。同样道理,内存也是如此,也是像尺子一样线性排布,只不过这个范围略大,在我们最广泛使用的32位操作系统下,是从0~4294967295之间,而地址就是这之中的一个编号而已,习惯上,在计算机里地址我们常常用其对应的十六进制数来表示,比如0x12ff7c这样。在我们C程序中,每一个定义的变量,在内存中都占有一个内存单元,比如int类型占四个字节,char类型占一个字节等,每个字节都在0~4294967295之间都有一个对应的编号,C语言允许在程序中使用变量的地址,并可以通过地址运算符"&"得到变量的地址。

        int i ;
        int a[4] = {'a','b','c','d'};
        for (int i = 0; i < 4; ++i)
        {
            /* code */
            printf("int address:0x%x,value:%c\n",&a[i], a[i]);
        }
    int address:0xe164ec00,value:a
    int address:0xe164ec04,value:b
    int address:0xe164ec08,value:c
    int address:0xe164ec0c,value:d
    

    指针

    简单的讲,地址就是逻辑内存上的编号,而指针虽然也标识一个编号,也是一个地址,但两者性质却不相同,一个代表常量,另一个则是变量。就好比内存是一把尺子,而指针就是尺子上的游标,可以左右移动,他某一时刻是指向一个地方的,这就是指针变量。
    由于指针存放的都是地址,在32位操作系统下在0~4294967295这个区间内,所以:在32位操作系统下,任何类型的指针变量都占4个字节!
    在64位操作系统下,任何类型的指针变量都占8个字节!

    int main()
    {
            int *p;
            char *p1;
            float *p2;
            double *p3;
            struct INFO *p4;   //struct INFO类型为结构体类型 我们将会在后面的章节中讲解
            void *p5;
            printf("int point size is :%d\n",sizeof(p));
            printf("char point size is :%d\n",sizeof(p1));
            printf("float point size is :%d\n",sizeof(p2));
            printf("double point size is :%d\n",sizeof(p3));
            printf("struct point size is :%d\n",sizeof(p4));
            printf("void point size is :%d\n",sizeof(p5));
            return 0;
    }
    

    打印结果64位下

    int point size is :8
    char point size is :8
    float point size is :8
    double point size is :8
    struct point size is :8
    void point size is :8
    [Finished in 0.1s]
    

    数组与指针

    由于每个数组元素,相当于一个变量,因此指针可以指向数组中的元素,也就是说可以用指针方式访问数组中的元素,对于一个指向数组元素的指针变量的定义和赋值方法,与指针变量相同。
    C语言规定,数组名代表数组的首地址,也就是第0号元素的地址。因此:

    int *p; /*定义 p 为指向整型变量的指针*/
    p=a; /*等价于 p=&a[0]; */
    int *p=a; /*等价于 int *p=&a[0]; */
    

    对于指向首地址的指针p,p+i或(a+i)就是数组元素a[i]的地址,(p+i)或(a+i)就是a[i]的值。
    如果指针变量p已指向数组中的某一个元素,则p+1指向同一数组的下一个元素。

    int i;
            int a[10]={1,2,3,4,5,6,7,8,9,0};
            int *p=a;
            for(i=0;i<10;i++)
            {
                    printf("P Value:%d   a Value :%d\n",*(p++),*(a+i));
            }
            printf("\n");
            return 0;
    

    打印结果

    P Value:1   a Value :1
    P Value:2   a Value :2
    P Value:3   a Value :3
    P Value:4   a Value :4
    P Value:5   a Value :5
    P Value:6   a Value :6
    P Value:7   a Value :7
    P Value:8   a Value :8
    P Value:9   a Value :9
    P Value:0   a Value :0
    

    相关文章

      网友评论

          本文标题:C语言

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