C语言告别篇

关键字:

1、const:修饰普通变量时,变量又被叫做“常变量”,因为具有常量属性,只读,但是仍然可以用地址来修改其内容。

注意:const  int  *p=&a  <=> int  const  *p=&a;

        两者等价,const修饰的都是指针p指向的内存,让指向的内存内容不可发生改变;

        如果要const修饰指针的指向则要这样用:

        int  *const p=&a;

另外,const修饰的静态变量/全局变量是保存在常量区,不可以用指针来修改。

2、typedef:

   范例要点:

typedef  int*  PINT

PINT a,b;     //这里的a和b都是int类型的指针,容易误认为只有a是指针。

 3、全局变量声明在 .h 文件中,但是定义在 .c 文件中。

指针作为函数参数:

指针的值传参:

void func1(int *q)
{
    int b=10;
    q=&b;
}

int main()
{
    int x=0;
    int *p=&x;
    printf("before:%p\n",p);   //调用函数前的地址
    
    func1(p);
    printf("after:%p\n",p);    //调用函数后的地址
    return 0;
}

    以上代码段运行结果为,调用函数前后p的地址相同,对应值也不发生变化,函数内的q操作相当于黑盒,对p毫无影响;

    这是因为func1参数确实为地址,但是调用时主调函数传入的参数p时指针;指针本身就是地址,所以对于指针来说,这是指针的数值传参,而不是地址传参。

   而如果想要改变这里指针p的地址和内容,有两种办法,用指针的数值传参的返回值,返回改变后指针q;即:

int *func2(int *q)
{
    static int b=10;     //这里static是因为自定义函数执行结束后,内存会释放这部分空间
                           所以用static修饰后,生存期更为合法;
    q=&b;
    return q;
}

int main()
{
    int x=0;
    int *p=&x;
    printf("before:%p\n",p); 
    
    p=func2(p);
    printf("after:%p\n",p);

    return 0;
}

或者利用二级指针,然后主调函数传参时,用指针p的地址,即:

func2(int **q)
{
    int b=10;     
    *q=&b;
}

int main()
{
    int x=0;
    int *p=&x;
    printf("before:%p\n",p); 
    
    func2(&p);
    printf("after:%p\n",p);

    return 0;
}

这样指针就利用地址传参,从而对指针p进行一系列操作。

没了。。。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值