C语言学习笔记(2)

一. 数组与指针

1.函数参数表中的数组实际上是指针

sizeof(a) == sizeof(int * );
int a[ ] ⇔ int *a
以下四种函数原型是等价的:

  • int sum (int *ar, int n);
  • int sum (int ar[ ], int n);
  • int sum (int *, int);
  • int sum (int[ ],int);

2. 数组变量是特殊的指针

  • 数组本身表示地址,

    • int a[10];
    • int *p = a; // 无需用&取变量
  • 数组的单元表达的是变量,需要用&取地址。

  • [ ]运算符可对数组做,也可对指针做 ;
    p[0] ⇔ a[0]

  • *运算符可以对指针使用,也可对数组做;

  • 数组变量是类型const指针,因此不能变赋值;
    int a[ ] ⇔ int *const b;

二.指针运算

(1)给指针加、减一个整数(+,+=,-,-=);
(2)递增递减(++,--);
(3)两个指针相减;

1. 加减 :

  • 指针加一即指针所指地址值加上一个sizeof(指针所指类型),移动到下一单元格。
  • 指针1 - 指针2结果是单元格之差,并非地址的数值差:
    (指针1 - 指针2)/ sizeof(指针类型);

2. *p++

  • 取出p所指的数据后,把p移动到下一单元格;
  • 用于数组类连续空间操作;
  • 在某些CPU上,这可以直接被翻译成一条汇编指令;

3. 指针比较

  • <, <=,==,>,>=,!=可以对指针作比较(比较内存中的地址);
  • 数组中的地址是线性增加的。

4. 0地址

  • 0地址通常是一个不能够随意碰的地址;
  • 指针不应该具有0值;
  • 用0地址通常表示特殊的事情:
    • 返回值无效的;
    • 指针没有被真正初始化。
  • NULL是一个预定义的符号,表示0地址

5. 指针类型

  • 无论指向什么类型,所有的指针的大小都是一样的,因为都是地址;
  • 指向不同类型的指针是不能直接相互赋值的;这是为了避免用错指针。

6. 指针作用

  • 需要传入较大的数据时用作参数;
  • 传入数组后对数组做操作;
  • 函数返回不止一个结果;
  • 需要用函数来修改不止一个变量;
  • 动态申请的内存。

我的手写笔记


MOOC代码

产生的问题

1.PTA

解决: 通过查询资料得知:(*p)++ 先取指针p指向的值,再将该值自增1

2.* p++的含义

解决: 单目运算符 * 级别低于 ++ 及取出 P 中的值之后把P移到下一个位置。

总结:

      1. *p++、(* p)++、* ++p、++* p 的区别
             (1).  *p++   先取指针p指向的值,再将指针p自增1;
             (2).  (*p)++ 先取指针p指向的值, 再将该值自增1;
             (3).  *++p   先将指针p自增1, * 操作再取出该值;
             (4).  ++*p   先取指针p指向的值, 再将该值自增1;
posted @ 2020-03-08 17:54  ABClazyboy  阅读(534)  评论(1编辑  收藏  举报