写哪儿指哪儿——值传递
2015-07-20 15:32
288 查看
时至今日还在纠结这类问题,实在是惭愧……
C/C++的参数是值传递。也就是说形参(仅在该函数内部可以访问)只是实参的一份拷贝。
通常,为了改变一个数值,我们传入指向这个数值的指针,函数体内改变这个指针的指向,从而改变对应数值。
这样或许更直观:
虽然在函数pointToRoot里改了q的值,但是改的是形参,对main里q并没有效果。
我们要改指针q,那么我们需要传入的参数就应该是指向指针q的指针&q,在函数pointToRoot里改变&q指向的值:
C/C++的参数是值传递。也就是说形参(仅在该函数内部可以访问)只是实参的一份拷贝。
通常,为了改变一个数值,我们传入指向这个数值的指针,函数体内改变这个指针的指向,从而改变对应数值。
void swap(int *p, int *q) { int tmp = *p; *p = *q; *q = tmp; } int main () { int a = 1, b = 2; swap(&a,&b); return 0; }
这样或许更直观:
int main () { int a = 1, b = 2; int *p,*q; p = &a; q = &b; printf("%d %d\n",*p,*q); // 1 2 swap(p,q); printf("%d %d\n",*p,*q); // 2 1 return 0; }
改变指针的值?
现在有个函数要改变一个指针,一开始,我写成了这样:void pointToRoot(int *root, int *q) { q = root; } int main () { int a = 1, b = 2; int *root,*q; root = &a; q = &b; printf("%d %d\n",*root,*q); //1 2 pointToRoot(root,q); printf("%d %d\n",*root,*q); //1 2 return 0; }
虽然在函数pointToRoot里改了q的值,但是改的是形参,对main里q并没有效果。
我们要改指针q,那么我们需要传入的参数就应该是指向指针q的指针&q,在函数pointToRoot里改变&q指向的值:
void pointToRoot(int *root, int **q_ref) { *q_ref = root; } int main () { int a = 1, b = 2; int *root,*q; root = &a; q = &b; printf("%d %d\n",*root,*q); //1 2 pointToRoot(root,&q); printf("%d %d\n",*root,*q); //1 1 *root = 3; printf("%d %d\n",*root,*q); //3 3 return 0; }
相关文章推荐
- MSSQL - 用GUID值来完成数据表行标识
- openssl 自签发证书及ssl 原理简介(一)
- ACM_Bellman-ford算法
- ArcGis转换OSM数据及其数据裁剪
- LeetCode—Count Primes
- IOS:MD5加密
- php 数组转xml
- zoj 1586 QS Network
- 欢迎使用CSDN-markdown编辑器
- getApn has exception: No permission to write APN settings
- 让多个Fragment切换不实例化
- zoj 1586 QS Network
- 职场中的十大低级错误
- hdu 1814 Peaceful Commission(2-sat)
- 通过浏览器直接打开Android应用程序
- 【CF】222 Div.1 B Preparing for the Contest
- [转]关于GET和POST的区别
- Java学习从入门到精通Java Learning Path
- ACM_Floyd-Warshall (Floyd) 算法
- redis-cluster研究和使用