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++支持引用&。
上一篇: Shell脚本入门
下一篇: linux命令eval的用法讲解