指针

代码:https://github.com/saber110/C_review
`</pre>

# 初始化

’*‘ 表示对应地址的内容

<pre>` 指针变量名表示地址
`</pre>

### 指针变量中只能存放地址

指针在初始化值的时候,一定要用变量的地址,在初始化完成之后可以不用地址改变指针的值

<pre>`int a = 200,* pointer;
pointer = a;
`</pre>

**这是不合法的**

<pre>`int a = 200,* pointer;
*pointer = a;//未进行初始化,存储单元无法预测
`</pre>

**这也是不合法的**

<pre>`int a = 200,* pointer;
pointer = &amp;a;
`</pre>

**这也是合法的**

<pre>`int a = 200,* pointer;
pointer = &amp;a;
*pointer = a;//等价于pointer = &amp;a;
`</pre>

**迷之合法**

综上,数组初始化只能有

<pre>`int *pointer = &amp;a;
或者
int * pointer;
pointer = &amp;a;
`</pre>

**两种方法**

# 参数传递
  1. 不能通过改变指针形参的值而企图使指针实参的值发生改变(C语言在函数调用时只能单向值传递
  2. 数组/指针作为形参时,传递的是对应的地址,改变形参的值可以改变实参
  3. 调用函数时形参指向实参,实际上指向同一个内存单元
  4. 如果用指针变量作为实参,指针变量必须要有具体的值,即必须指向对应已定义的对象

    REMARK: 最重要的是可以改变指针的指向地址啊!!!!

    通过指针引用数组

    `若p->a[0],则++p->a[1]
    若p->&a[0],则++p->&a[1]
    p1,p2指向同一个数组时,p2-p1表示相差元素的个数
    
    a[i] = *(a+i)
    &a[i] = &(a+i)
    `

    数组

    一维数组

    `int a[10];
    1\. *a代表a[0]的内容即a[0]
    2\.   a代表a[0]的地址即&a[0]
    3\.   *(a + 1) 代表a[i]的内容
    `

    多维数组

    `int a[10][10];
    1\. *a代表a[0][0]的内容即a[0][0]
    2\.   a代表a[0][0]的地址即&a[0][0]
    3\.   *(a + 1) 代表a[i]         行            的地址
    4\.   *(a + 1) +1代表a[1][1]的地址,即&a[1][1]
    5\.   *(*(a + 1) +1)代表a[1][1]的内容,即a[1][1]
    `

    字符指针

    `char *a;
    scanf("%d\n",a);
    
    坚决不能使用上面这种,a的指向地址无法预测,可能会修改系统中敏感位置的值
    
    char *a,arr[10];
    a=arr;
    scanf("%d\n",a);
    
    正确用法
    `

    函数指针

    `int (p)(int x,int y);//指向返回值位int的函数指针
    int
    p(int x,int y) = int * (p(int x,int y))//返回值为指针的函数