C语言笔记 -- 函数参数为指针变量时的参数传递

1、 当函数的参数是一个指针时,传递给函数是实参指针的一个拷贝,所以改变形参指针并不会改变实参指针。如下例所示,函数strlen会修改形参指针str,但是main函数调用函数strlen返回后,实参指针str仍然指向字符串"now is the time"的首地址。

此外,strlen函数的形参const char *str是一个指向常量的指针(只是该指针自认为指向的是常量对象),而实参char *str 并不是一个常量对象。也就是说一个指向常量的指针只是无法通过该指针修改所指向的对象的值,该指针可以指向一个非常量对象,而且那个对象的值可以通过其他途径改变。

最后, const char *str 等同于 char const *str

int *const cur 表示指针cur是一个常量指针,把*放在const关键字之前用以说明指针是一个常量。常量指针必须初始化,而且一旦初始化,它的值(也就是存放在指针中的那个地址)就不能被改变。

#include<stdio.h>

int strlen(const char * str) {
    int len = 0;
    while (*str != '\0') {
        len++;
        str++;
    }
    return len;
}

int main(int argc, char const *argv[])
{
    char *str = "now is the time";
    printf("%d\n", strlen(str));
    printf("%s", str); 
    return 0;
}

结果:

15
now is the time

2、数组名做左值时表示整个数组的存储空间,而不是首元素的存储空间,数组名做左值时不支持++、赋值 这些运算符,但支持取地址运算符&,所以&a是合法的。例如 int a[10],&a 的类型是int (*)[10],是一个指向大小为10的int型数组。
 

数组名做右值时是一个指向数组第一个元素的指针。例如,int a[10],  a做右值时等价于 &a[0],类型是int *

当数组作为函数参数 时,传递给函数的参数是指向数组起始位置的指针的拷贝,作为参数的数组名是一个指针。

如下所示。在创建数组a的函数中使用sizeof(a)得到的是整个数组占用的字节大小。而当数组a作为参数传递给被调函数后,在被调函数中使用sizeof(a)得到的是指针的大小。

#include<stdio.h>

void testArray(int a[]) {
    printf("%d\n", sizeof(a)); // 结果为8,是指针a的大小。
}

int main(int argc, char const *argv[])
{
    int a[11] = {1, 3, 2, 5, 6, 4, 9, 8, 8, 6, 10};
    printf("%d", sizeof(a)); //结果是44,是整个数组的字节大小,等于 11 * 4
    testArray(a);
    return 0;
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值