零基础C语言:第七讲(指针数组、数组指针、指针与二维数组)

339 阅读2分钟

「这是我参与2022首次更文挑战的第7天,活动详情查看:2022首次更文挑战

指针与数组的区别

  • 指针和数组的区别

    • 数组名只是一个地址,而指针是一个左值。

      • 举例(在while循环中不能直接使用str进行自增操作,因为str是数组名只是一个地址)
      • 结果

指针数组和数组指针

  • 指针数组和数组指针

    • 指针数组:int p1[5];(运算优先级是数组下标[]先于取值运算符)

      • 指针数组是一个数组,每一个数组元素存放一个指针变量
      • 举例
      • -结果
    • 数组指针:int (*p2)[5];(运算优先级是()与[]相同,同时出现则优先级从左到右)

      • 以上定义的含义:先定义一个指针p2,该指针指向的是一个含有五个元素的数组
      • 数组指针是一个指针,他指向的是一个数组
      • 举例
      • 结果
  • 补充:左值和右值

    • 左值是用来指明一个对象的表达式。最简单的左值就是变量名称。左值(lvalue)之所以称为“左”(以首字母为 L,代表 left),是因为一个左值表示一个对象,它可以出现在赋值运算符(assignment operator)的左边,例如“左表达式=右表达式”。
    • 其他表达式(那些表示一个值但不指明一个对象的),被类似地称为右值(rvalue)。右值是可以出现在赋值运算符右边而不是左边的表达式。例如,常量和算术表达式。
    • 从一个左值中必定可以解析出对应对象的地址,除非该对象是位字段(bit-field)或者被声明为寄存器存储类。生成左值的运算符包括下标运算符(subscript operator)[]和间接运算符(indirection operator)*,如下表所示(如果 array 已被声明为数组,而 ptr 被声明为指针变量)。
    • 举例

指针与二维数组

  • array表示的是什么

    • 举例
    • 结果
  • *(array+1)表示的是什么

    • 举例
    • 结果
  • ((array+1)+3)表示的是什么

    • 举例
    • 结果
  • 结论

    • *(array+i)==array[i];
    • ((array+i)+j)==array[i][j];
    • ((*(array+i)+j)+k)==array[i][j][k];……
  • 注意

    • 在二维数组中array+1和*(array+1)的值是一样的,但含义不一样。array+1是int **类型,指向的是数组array的第二行的起始地址; *(array+1)是int *型,指向的是数组array的第二行第一个元素的地址。