美文网首页
数组形参的表达方式

数组形参的表达方式

作者: fever105 | 来源:发表于2015-09-27 23:37 被阅读168次

数组形参的表达方式

设计一个有数组作为参数的函数,代表数组的形参有两种表达方式:指针 vs 数组名。从作用上来讲,两者完全相同,可以互换。但它们背后所隐含的区别更值得了解。

接下来,我们要自己设计并实现一个strlen()函数,作用同标准库中的同名函数一样,即返回一个字符串的长度。

指针作为形参

size_t mystrlen(char *s)
{
    int count = 0;
    
    while (*(s++) != '\0') {
        count++;
    }
    
    return count;
}

客户端程序如下:

size_t mystrlen(char *s);

int main(int argc, const char * argv[]) {
    
    char x[] = "12345";
    printf("%zd\n", mystrlen(x));
    return 0;
}
  • 首先,我们知道数组名虽然是指向数组第一个元素的指针,但这个指针永远不能被改变,即不能指向其他对象(可以说是一个指针常量)。而指针变量则不同,它可以指向任意对应类型的对象。
  • 其次,我们还知道在函数调用的过程中,实参的值会被赋给形参,被调用函数内部可以通过操作形参来操作实参的值。

由此可以得出,char x[]实际上是被赋给了char *s,即s = x;这样,函数内部就可以对s进行指针运算,让它指向不同的对象,就好像上面的代码s++所做的一样,而x++就不行。

所以,以下用法都是正确的:

mystrlen("Hello World!");
mystrlen(array);
mystrlen(ptr);

数组名作为形参

所有代码同上面一样,只是将形参char *s改为char s[]。两者完全通用,效果一致。但是前面不是说过作为指针的数组名不能改变吗?为什么在s是数组名的情况下,s++依然正确呢?

  • 首先,我们知道在声明数组的时候,必须明示数组的长度。例如char x[100]char x[] = "abc"
  • 其次,思考一下为什么作为形参时,可以写成char x[]呢?这是因为你不能将数组传给函数,只能传递指针。char x[]作为形参的意义是:一个指向char型数组元素的指针。所以,即使将形参写作char x[100],也不代表形参是一个长度为100的数组。事实上,100会被忽略,x还是会被当作一个指针使用。

相关文章

  • 数组形参的表达方式

    数组形参的表达方式 设计一个有数组作为参数的函数,代表数组的形参有两种表达方式:指针 vs 数组名。从作用上来讲,...

  • 数组形参

    数组形参 以下四种函数原型声明是等价的: 因为数组名是数组第一个元素的地址,当数组名作为实参时,要求与之匹配的形参...

  • C语言数组指针

    总:如果编写的函数需要修改数组,在声明数组形参的不使用const;如果编写的函数不用修改数组,那么在声明数组形参时...

  • Day6 方法的参数传递(P46~P55)

    可变个数的形参 数组形参来定义方法 :public static void test(int a ,String[...

  • C++ 易混易错总结

    数组名&指向数组的指针 结果表明*a+1=(*a)+1 0133FB901252 默认形参 结果表明:1)默认形参...

  • 第七章 函数(3)函数和数组

    (三)函数和数组 1.数组作为函数的形参时,真实发生的情况。 当我们用数组形式作为函数的形参时,比如aadd(i...

  • 数组forEach

    数组遍历,以下方式不能改变原数组数据。 原因item是形参,对形参改变值不能改变原有属性的值,当数组中的元素为对象...

  • 数组形参传递

  • Go语言向函数传递数组

    如果你想向函数传递数组参数,你需要在函数定义时,声明形参为数组,我们可以通过以下两种方式来声明: 方式一 形参设定...

  • 数组和指针

    数组初始化 函数,数组,指针 使用指针形参 指针操作 通过指针改变数组内容

网友评论

      本文标题:数组形参的表达方式

      本文链接:https://www.haomeiwen.com/subject/zfuwcttx.html