第28课 指针和数组分析(上)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第28课 指针和数组分析(上)相关的知识,希望对你有一定的参考价值。

1. 数组的本质

(1)数组是一段连续的内存空间

(2)数组的空间大小:sizeof(array_type)*array_size;

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

【编程实验】a + 1的结果是什么?  (答案是第2个元素的地址)

#include <stdio.h>

int main(){
    
    //将数组每个元素初始化为0
    int a[5] = {0};
    int* p = NULL;

    printf("a = 0x%X\n",(unsigned int)(a));//首元素的地址
    printf("a + 1 = 0x%X\n",(unsigned int)(a + 1));//第2个元素地址
    
    //p + 1 ==(unsigned int)p + n*sizeof(*p);
    printf("p = 0x%X\n",(unsigned int)(p));//0x0
    printf("p + 1 = 0x%X\n",(unsigned int)(p + 1));//0x4

    return 0;
}

2. 指针的运算

(1)指针是一种特殊的变量,与整数的运算规则为:

    p + n  == (unsigned int)p + n * sizeof(*p);

  //当指针p指向一个同类型的数组的元素时,p+1指向当前元素的下一个元素,p-1指向上一个元素。

(2)指针之间只支持减法运算且参与减法运算的指针类型必须相同

  p1 - p2 = ((unsigned int)p1 – (unsigned int)p2)/sizeof(type)

  ▲注意:

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

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

3. 指针的比较

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

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

(3)任意两个指针之间的比较运算(==、!=)无限制。

(4)参与比较运算的指针类型必须相同

【实例分析】指针运算初探

#include <stdio.h>

int main(){
    
    char s1[]={H,e,l,l,o};//
    int i=0;
    char s2[]={W,o,r,l,d};
    char* p0 = s1;
    char* p1= &s1[3];//p1指向s1数组的第3个元素,即‘l‘
    char* p2 = s2;
    int*  p = &i;
    
    printf("%d\n",p0 - p1);    //-3
    //printf("%d\n",p0 + p2);  //编译错误,指针不支持相加操作
    printf("%d\n",p0 - p2);    //指向两个不同数组,结果未定义,gcc下为12
    //printf("%d\n",p0 - p);   //编译错误,不同类型指针不能相减!
    //printf("%d\n",p0 / p2);  //编译错误,不同类型指针进行除法运算!
  
    return 0;
}

【实例分析】指针运算的应用

#include <stdio.h>

//统计元素的个数
#define DIM(a)  (sizeof(a) / sizeof(*a))

int main(){
    
    char s[]={H,e,l,l,o};//
    char* pBegin = s;
    char* pEnd = s + DIM(s);   //关键点,数组名 + n
    char* p = NULL;
    
    printf("pBegin  = %p\n",pBegin); //第1个元素的地址
    printf("pEnd  = %p\n",pEnd);     //最后1个元素的地址
  

    printf("Size: %d\n",pEnd - pBegin); //5
    
    //在同一行中打印出:Hello
    for (p = pBegin;p < pEnd; p++)
    {
         printf("%c",*p);
    }

    printf("\n");
  
    return 0;
}

4. 小结

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

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

(3)指针和整数可以进行运算,其结果为指针

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

(5)指针之间支持比较运算,其类型必须相同

 

以上是关于第28课 指针和数组分析(上)的主要内容,如果未能解决你的问题,请参考以下文章

第29课 指针和数组分析(下)

指针和数组分析(上)

指针和数组分析(下)

第28课 再论智能指针(下)

第41课 内存操作经典问题分析一

第36课 函数与指针分析