C进阶养成记 - 养成记28:指针和数组分析(上)

--事物的难度远远低于对事物的恐惧!

    这章我们来分析下指针和数组,在前两章我们谈了数组和指针,我们知道:

    数组的本质:

        -数组是一段连续的内存空间

        -数组的空间大小为sizeof(array_type) * array_size

        -数组名可看做指向数组第一个元素的常量指针

    那么我们来看一个问题:对于一个数组 int array[],array + 1是什么?这个运算的意义代表什么?

    下边以代码来展示一下

    

#include <stdio.h>

int main()
{
    int array[5] = {1,2,3,4,5};

    int i=0;
	
    for(i=0; i<5; i++)
    {
	printf("0x%p -> %d\n", &array[i], array[i]);
    }
    printf("**************\n");

    printf("array + 1 = 0x%p\n*(array + 1) = %d\n", array + 1, *(array + 1));
    
    return 0;
}

编译执行的结果如下:


扫描二维码关注公众号,回复: 153038 查看本文章

从输出结果来看,我们可以知道 array + 1 == &array[1]*(array + 1) == array[1]。

为了弄清楚上边的两个等式,我们首先来了解下指针的运算:

    -C语言中的指针是一种特殊的变量,它与整数的运算规则为: 

        p+n  -> (unsigned int)p + n*sizeo(*p)

    -当指针p指向一个同类型的数组元素时:p + 1将指向当前元素的下一个元素;p - 1将指向当前元素的上一个元素

    -同理可引申出:p + i将指向当前元素之后的第i个元素;p - 将指向当前元素之前的第i个元素

所以对于以上代码中的array + 1,array是数组首元素的地址,那么 array + 1则指向了数组首元素的下一个元素,就是array[1],所以就有了array + 1 == &array[1]*(array + 1) == array[1],同理可以推导:array + i == &array[i]*(array + i) == array[i](i为数组下标)

    上边我们只说了指针与整数之间的运算,那么指针和指针之间可不可以进行运算?在C语言中

    -指针与指针之间只支持减法运算

    -参与减法运算的指针类型必须相同

    p1 - p2 -> ( (unsigned int)p1 - (unsigned int)p2 ) / sizeof(type)

    其中需要注意的是:

        -只有当两个指针指向同一个数组中的元素时,指针相减才有意义,其意义为指针所指元素的下标差

        -当两个指针指向的元素不在同一个数组中时,结果未定义

    指针的比较运算:

        -指针也可以进行关系运算( <, <=, >, >=)

        -指针关系运算的前提是同时指向同一个数组中的元素

        -任意两个指针之间的比较运算(==, !=)无限制,而这样的比较运算也没什么实际意义

        -参与比较运算的指针类型必须相同

    总结:

        -数组声明时编译器自动分配一片连续的内存空间

        -指针声明时只分配了用于容纳地址值的4字节 空间

        -指针和整数可以进行运算,运算结果为指针

        -指针之间只支持减法运算,其结果为数组元素下标差

        -指针之间支持比较运算,同时指针类型必须相同

猜你喜欢

转载自blog.csdn.net/lms1008611/article/details/80154165