C语言/指针与数组&指针与函数

对初学者来说,C语言里比较绕的应该就是指针数组/数组指针、指针函数/函数指针了,当然指针也是C语言里面比较难的部分了。

下面我就简单介绍一下指针与数组和函数的组合之间的区别:


函数:

   —— 可以代替大量重复项代码的功能模块 

格式:

    <数据类型><函数名(形式参数)  注意:<数据类型>可以是基本数据类型,也可是构造数据类型

   {

         函数体                            <函数名>满足标识符命名三大规则

     }

                                           <参数>格式类似于变量的定义(int a),多个参数之间用“,”分隔

                                                                                                    

                                           函数体表示函数的功能实现


<数据类型> :代表了函数的返回值:返回函数的执行状态;返回函数中的变量值;返回函数中的变量地址

<函数名>:代表函数的地址

(参数):代表函数需要的数据

{}:代表函数的范围,也称函数的作用域

 

函数声明

       末有“;”告诉系统以识别函数

       被调函数在主函数之前,则不需要声明

 

函数调用:

       格式:<函数名>(实际参数)

 

main函数是整个程序的入口;函数名不能改;被操作系统调用,返回值返回给操作系统

 

函数原型:char *getschar *s

头文件:#include<stdio.h>

链接库:

功能:从标准输入流中读取字符串放入指针s指向的缓存区中

参数:s:缓存区的指针

返回值成功 返回//失败   返回NULL

 

数组:

 

一维数组:一组数据类相同,且在内存上连续存储的数据的集合

 

    格式:  <存储类型><数据类型><数组名>[数组长度]

    注意:<数据类型>可以是基本数据类型,也可是构造数据类型

 

    数组的初始化:全部初始化;部分初始化;省略数组长度的初始化(a[]={11,12,13,14}      

    数组元素的调用:<数组名>[数组的下标]

                

二维数组:          

    格式: <存储类型><数据类型><数组名>[行数][列数]

 

    注意:省略类型初始化(与鼠族在内存上的存储有关,按行存储)

                         int a[][4] 

                         int a[3][]  X  //列号不能省略

                         int a[3][4]

          数组元素调用: <数组名>[行下标][列下标];

 

指针:

         地址:内存以字节为单位,每个字节都对应一个编号,而每个编号代表一个地址

         指针:就是地址

         指针变量:保存了指针常量(地址常量)的变量

         格式: <存储类型><数据类型>  *<指针变量名>:

         eg: Int *p=&a;    p ===>  int*    表示指针的类型

              *p===> int      表示指针指向的空间的类型

              * ——>作用为完成指向

 

指针的运算:        

算术运算:

   p++/p-- :表示指针向地址大/小端偏移一个单位(指针指向空间类型的大小)

   p+n/p-n

   p-q:若为正数,则p靠近大端

        若为负数,则p靠近小端

        若为0,则p、q指向同一块内存

        p-q 结果代表两个地址之间相差几个单位

  

指针的修饰:  

         1const(不可改,常量) >>>>const修饰的对象

 

               int * const p;指针指向空间不可改,但指向空间的内容可改

               int const *p;指针指向空间可改,但指向空间的内容不可改

               const int *p;指针指向空间可改,但指向空间的内容不可改

               const int *const p;指针指向空间和内容都不可改

               const 和 int 可换顺序 


          2、void(空)         

               void *p;表示指针指向空间不确定


函数的调用:

        //printf("&a = %p,&b=%p",&a,&b); //取地址

 

        格式:<函数名>[实际参数]

        1)值传参

            传递的是变量的复制体,不影响变量本身

        2)地址传参

             传递的是变量本身,操作影响变量的结果

             [ 地址常量 &a 用地址变量指针 *x接收]

        3)一维数组传参

            int fun(int *p,int num) ;

            int fun(int p[ ],int num);

        4)二维数组传参

             int fun(int(*p)[n],int m,int n);

             int fun(int p[][n],int m,int n);

 

指针与数组AND函数


指针与数组:  

    指针数组:用于存储指针的数组,即数组元素都是指针

    数组指针:指向数组的指针

 

       1) 数组指针 : 本质是指针,指向类型是数组


           A、数组指针与一维数组

              int a[4];

              int*p[4] = &a // 数组指针指向数组整体 p+1 地址偏移4*4=24

                                 //[4]表示指针指向右4个元素的数组


变量与数据类型的关系:

int a = 5;   ===>>int

int *p = &a; ===>>int *

 

int a[6] ;      ===>>int [6]  a;===>INTint a;===>int [6];===>> INT //构造类型

int [6] *p = &a;===>>INT *p = &a;===>>int (*p)[6];  [ ]p结合的优先级高于*p结合的优先级,(*p[ ]称为指向数组的指针  

                         

           B、数组指针与二维数组

                 int a[2][3];

                 int*p[3] = a

 

        2指针数组 :本质是数组,数组元素是指针

          

            A、指针数组与一维数组

                 int a[3];

                 int * p[3] = { &a[0],&a[1],&a[2]};  

        

            B、指针数组与二维数组  

                 int a[2][3];

                 int * p[2] = { a[0],a[1] };

 

指针与函数        

           A、指针函数:本质是函数,返回值是指针 

                int * funintxint y);

                static 解决局部变量返回问题 

                malloc动态申请//free()释放

  

栈区变量  //动态 ,自动释放

static// 静态变量

malloc/free(C语言)

new/delete(C++)

     

          B、函数指针:本质是指针,指向函数 

                 int  funint xinty);

                int (*p) (int ,int )=fun;                   


 函数指针数组   ===>>int *p[4])(intint==addsubmuldiv);

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值