zoukankan      html  css  js  c++  java
  • C中函数形参声明为数组形式,它其实是指针

    问题描述:

    1 void writelines(char *lineptr[], int nlines)
    2 {
    3     while(nlines-- > 0)
    4     {
    5         printf("%s
    ", *lineptr++);
    6     }
    7 }

    C语言规定,数组名指向数组的首地址,数组已经定义,则数组名也就定了,不可更改,所以数组名是一个常量,不能对它执行变量相关的操作,比如说赋值或者自增等,那么为什么在上图中第一行中lineptr被定义为一个字符指针数组,为什么在第5行中却对它进行了自增操作?

    原因:在一般情况下,数组名的确是不可修改的,只是在上图第一行中lineptr作为函数形参,其实编译器并不是把它当做数组名,而是看作一个指针

              可以这样思考一下:c语言规定,数组名作为实参传递给被调用函数相应形参的不是整个数组,而是数组的首地址,也就是指针,那么如果lineptr被认为是一个数组名的话,由于数组名不可被赋值,那么实参将不能传递给形参,所以编译器将lineptr认为是一个指针变量,只有当它是一个指针变量时,它才能心安理得地接受主调函数传过来的实参,所以 当一个函数的形参被声明为数组形式时,在编译器眼中它不是数组,而是一个指针变量。

    另:上次说到了二级指针,其实,这里的lineptr就是一个二级指针,指向指针的指针。

      如果是void writelines(char lineptr[]); 如果是这种形式的话,那么lineptr也是指针,一级指针,指向的是char类型的数组

  • 相关阅读:
    .Net Core微服务——Ocelot(2):集成Consul 老马
    .NET 微服务——CI/CD(1):Jenkins+Gitee自动构建 老马
    .Net Core——用SignalR撸个游戏 老马
    JUC之线程间的通信
    SpringBoot文章合集
    JUC之线程间定制化通信
    JUC之集合中的线程安全问题
    JUC文章合集
    JUC之Lock接口以及Synchronized回顾
    JUC概述
  • 原文地址:https://www.cnblogs.com/OoycyoO/p/8642268.html
Copyright © 2011-2022 走看看