c语言 关于指针注意事项

使用指针变量作为函数参数时,只有在获取地址的情况下对元素(*p)进行操作,才能真正地修改变量。因为此时实参传给形参,就是将堆上的申请的首地址传给形参,这样形参和实参都指向了堆上的内存,形参对堆上内存内容的修改,实参也是得到了修改。但是对传入地址(p)进行操作是无法对原指针本身进行修改的。因为函数在接收参数的过程中是单向的一次性值传递,此时的参数传入地址,调用函数时只是对值参产生一个副本,对副本的操作不会影响原值,也就是说不会改变传入地址。

例:

void swap(int* a,int* b){
    int* temp=a;  //企图通过地址交换达到交换的目的!  错误!!
    a=b;
    b=temp;
}
//因为指针变量实际上是unsigned型的变量 所以上述代码可以这么理解:
void swap(unsigned int a,unsigned int b){  //int*=unsigned int
    unsigned int temp=a;
    a=b;
    b=temp;
}
//这样就容易理解为何出错了

     

如果真的希望能够修改主函数传进来的指针变量,可以通过引用&、给函数加指针型的返回值、双重指针(后续补充,因为不会)来解决。

引用&:

void swap(int* &a,int* &b){
    int* temp=a;
    a=b;
    b=temp;
}

指针型返回值:

由于c语言函数只能返回一个值,故换个链表初始化的例子:

mylist * initlist(){ //mylist为所定义的结构体类型
    mylist *s;
    s=(mylist *)malloc(sizeof(mylist));
    s->next=NULL;
    return s;
}//使用函数返回值的办法

void  initlist(mylist* &s){
    s=(mylist *)malloc(sizeof(mylist));
    s->next=NULL;
 }//使用引用的办法
    

双指针:

 

 

由于c语言函数返回值只能有一个,当遇到需要输出大于一个返回值时,可以采取全局变量、返回数组或者结构体指针的办法,例子后续补充(因为暂无时间)。

c编译器没有引用&,但是可以使用双重指针;c++支持引用&。

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值