欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

c语言 关于指针注意事项

程序员文章站 2022-07-07 11:06:10
...

使用指针变量作为函数参数时,只有在获取地址的情况下对元素(*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++支持引用&。