指针、const

const

    如果const关键字写在类型名称前,就表示指针本身的内容可以被赋值,但是不可以通过这个指针

对它所捆绑的存储区进行赋值

    所有用来实现跨函数使用存储区的指针,都尽量按照上述方法加const关键字

   在声明指针的时候,可以把const关键字加在指针变量名称前,这种指针本身不可以被赋值,但可以

通过它对捆绑存储区进行赋值


 


1. 指针基础

     指针变量:用来记录存储区的地址

     只有记录有效地址的指针才可以使用

     只有有效指针前加*, 表示指针变量的捆绑存储区内容

   

     int *p

     指针变量:p

     指针类型:int *

     指针所指向的类型:int

     指针的值:p的值既地址的值

  

      无效指针分为两类:

      1.空指针里记录的是空地址(NULL), 它的数值就是0.

       2.所有其它无效指针统称为野指针

    

     程序中禁止出现野指针

     没有初始化的指针就是野指针

     int  *p = NULL; //对指针初始化,此时只是对指针变量p初始化

     指针与存储区内容之间的捆绑关系随着程序的执行,可以不断的变化.






    无类型指针:

   在声明指针的时候,使用void作为类型名称,这种指针叫做无类型指针

   这种指针可以和任何类型的存储区捆绑,不能通过指针了解到捆绑存储区的类型

   既不可以对这种指针做加减整数的计算,也不能在这种指针前面加*

   必须首先把这种指针强制类型转换成有类型指针,然后才能使用.

   这种指针通常多为函数的形式参数

    

2. 指针与数组

   指针与数组的区别:

   1.数组名称不可以被赋值,但是指针可以

   2.对数组名称和指针分别做sizof计算,结果不同

   3.对数组名称和对指针变量取地址,结果不同

  



    数组指针

    指针数组:中心词是数组,数组里的元素是指针

                        int* arr[10]; arr是数组,数组有10个元素,每个元素都是指针,指针对应捆绑区是int

                        char* str[10];字符指针数组,数组有10个元素,每个元素都是指针,指针对应的捆绑区是char


3. 指针与函数

   3.1. 函数形参=指针(int *p)



    

3.2.函数形参=数组(int arr[])

     当函数的形参之一为数组时,可进行跨函数的存储区传递,因为数组名即为数组的首地址,可看做指针


  

3.3 函数返回值=指针(int  *p)

   3.3.1.

    使用指针类型的返回值存储区,可以让一个函数使用另外一个函数的静态局部变量,非静态局部变量的地址不可以作为返回值使用

    为何不能用局部变量作为函数返回值(指针),原因是涉及到内存块,还未完全明白,先记住结论.


     指针形参可以作为返回值使用



    函数指针

/*

    函数指针演示,函数指针用来记录函数的地址

*/

#include <stdio.h>

int add(int num, int num1)

{

    return num+num1;

}

int main()

{

    int (*p_fun)(int,int)=  NULL; //函数指针声明

   p_fun = add;

  printf("%d\n",p_fun(4,7));

   return 0;

}


/*

     函数指针当形参

*/

#include <stdio.h>

void print_cb(int *p_num)

{

    printf("%d", *p_num);

}

void for_each(int *p_num, int size, void (*p_func)(int *) )//函数指针当形参

{

     int num=0;

    for(num=0;num<size;num++)

   {

         p_func(p_num+num);

   }

}

int main()

{

   int arr[]={1,2,3,4,5};

    for_each(arr,5,print_cb);

    printf("\n");

    return 0;

}


    指针函数

4. 指针与字符串

5. 二级指针

    二级指针可以用来记录普通指针存储区的地址

    二级指针可以代替指针数组,但是不能代替二维数组

    二级指针可以用作函数的形式参数,这样就可以让被调用函数使用其它函数提供的指针类型存储区

 /*

    二级指针演示

*/

   #include <stdio.h>

   int main()

   {

        int num=9;

        int *p_num = &num;//一级指针

        int *pp_num = &p_num;//二级指针

       **pp_num = 10;

       printf("num=%d\n",num);// num=10;

       return 0;

   }

    /*

        二级指针形式参数演示

   */

   #include <stdio.h>

  void setnull(int **pp_num)

{

     **pp_num = NULL;

}

int main()

{

   int num=0;

   int *p_num = &num;

   setnull(&p_num);

   printf("p_num=%p\n",p_num);

   return 0;

}

6. 总结

    参见网址:

    http://wenku.baidu.com/link?url=kwEOwMY5CCncSPEuSRdTlwKZb0uNgiyaqex5iqL93YIh2yRQ8pGapptv57R69rY2eSHJfKkmjnUPOQrdjtgn2xhCFJRoLne4z4vk-TsRCh7


http://wenku.baidu.com/link?url=ilJN9Nbnufn5SSl852r5hYNfujCyPGx906yWHnTDrgyB6nX1bMSze2JbbWSZ8m_UDYfOsHtP8toCob2JMWhThGDo0dG_OEL3C_KX8dOobwC

    (a).int a;

    (b).int *a;

    (c).int **a;

    (d).int a[10];

    (e).int *a[10];

    (f). int (*a)[10];

    (g). int (*a)(int);

    (h). int (*a[10])(int);

    

     

     

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值