c++ 指针(三)
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c++ 指针(三),小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含4385字,纯文字阅读大概需要7分钟。
内容图文
![c++ 指针(三)](/upload/InfoBanner/zyjiaocheng/738/8ed5ecedfc9c4845adc2d3decfcb5780.jpg)
指针
(6)传递指针给函数
只需要简单地声明函数参数为指针类型即可
#include <iostream> #include <ctime> using namespace std; void getSeconds(unsigned long *par); int main () { unsigned long sec; getSeconds( &sec ); // 输出实际值 cout << "Number of seconds :" << sec << endl; return 0; } void getSeconds(unsigned long *par) { // 获取当前的秒数 *par = time( NULL ); return; }
结果:Number of seconds :1294450468
能接受指针作为参数的函数,也能接受数组作为参数
#include <iostream> using namespace std; // 函数声明 double getAverage(int *arr, int size); int main () { // 带有 5 个元素的整型数组 int balance[5] = {1000, 2, 3, 17, 50}; double avg; // 传递一个指向数组的指针作为参数 avg = getAverage( balance, 5 ) ; // 输出返回值 cout << "Average value is: " << avg << endl; return 0; } double getAverage(int *arr, int size) { int i, sum = 0; double avg; for (i = 0; i < size; ++i) { sum += arr[i]; } avg = double(sum) / size; return avg; }
结果:Average value is: 214.4
传递指针给函数的过程补充:
#include <iostream> #include <ctime> void getSeconds(unsigned long *par); int main() { unsigned long sec = 0; cout << "Value of sec = :" << sec << endl; cout << "Value of &sec = :" << &sec << endl; cout << endl; getSeconds(&sec); // 输出实际值 cout << "Number of seconds :" << sec << endl; return 0; } void getSeconds(unsigned long *par) { cout << "Value of *par = :" << *par << endl; cout << "Value of par = :" << par << endl; cout << "Value of &par = :" << &par << endl; cout << endl; // 获取当前的秒数 *par = time(NULL); cout << "Value of *par = :" << *par << endl; cout << endl; return; }
(7)从函数返回指针
必须声明一个返回指针的函数
int * myFunction() { .... }
C++ 不支持在函数外返回局部变量的地址,除非定义局部变量为 static 变量
下面的函数,它会生成 10 个随机数,并使用表示指针的数组名(即第一个数组元素的地址)来返回它们:
#include <iostream> #include <ctime> #include <cstdlib> using namespace std; // 要生成和返回随机数的函数 int * getRandom( ) { static int r[10]; // 设置种子 srand( (unsigned)time( NULL ) ); for (int i = 0; i < 10; ++i) { r[i] = rand(); cout << r[i] << endl; } return r; } // 要调用上面定义函数的主函数 int main () { // 一个指向整数的指针 int *p; p = getRandom(); for ( int i = 0; i < 10; i++ ) { cout << "*(p + " << i << ") : "; cout << *(p + i) << endl; } return 0; }
结果:
624723190 1468735695 807113585 976495677 613357504 1377296355 1530315259 1778906708 1820354158 667126415 *(p + 0) : 624723190 *(p + 1) : 1468735695 *(p + 2) : 807113585 *(p + 3) : 976495677 *(p + 4) : 613357504 *(p + 5) : 1377296355 *(p + 6) : 1530315259 *(p + 7) : 1778906708 *(p + 8) : 1820354158 *(p + 9) : 667126415
补充:
1.指针的本质是变量,可以是各种数据类型,定义一个指针 "*ip",其中 "ip" 需要赋于一个地址(可以用 & 符号获取其他变量的地址再赋值给 ip),而 "*ip" 是一个具体的值,即读取地址后获得的值;
#include <iostream> using namespace std; int main() { int var = 20; int *ip; ip = &var; cout << "var的值:"; cout << var << endl; cout << "变量 ip 的储存地址:"; cout << ip << endl; cout << "指针 *ip 的值:"; cout << *ip << endl; return 0; }
结果:
var的值:20 变量 ip 的储存地址:0x7fff5e7deae8 指针 *ip 的值:20
2.
3.
4.
5. 关于值传递,指针传递,引用传递
值传递:
形参是实参的拷贝,改变形参的值并不会影响外部实参的值。从被调用函数的角度来说,值传递是单向的(实参->形参),参数的值只能传入,不能传出。当函数内部需要修改参数,并且不希望这个改变影响调用者时,采用值传递。
指针传递:
形参为指向实参地址的指针,当对形参的指向操作时,就相当于对实参本身进行的操作
引用传递:
形参相当于是实参的"别名",对形参的操作其实就是对实参的操作,在引用传递过程中,被调函数的形式参数虽然也作为局部变量在栈中开辟了内存空间,但是这时存放的是由主调函数放进来的实参变量的地址。被调函数对形参的任何操作都被处理成间接寻址,即通过栈中存放的地址访问主调函数中的实参变量。正因为如此,被调函数对形参做的任何操作都影响了主调函数中的实参变量。
#include<iostream> using namespace std; //值传递 4 void change1(int n){ cout<<"值传递--函数操作地址"<<&n<<endl; //显示的是拷贝的地址而不是源地址 6 n++; } //引用传递10 void change2(int & n){ cout<<"引用传递--函数操作地址"<<&n<<endl; n++; } //指针传递15 void change3(int *n){ cout<<"指针传递--函数操作地址 "<<n<<endl; *n=*n+1; } int main(){ int n=10; cout<<"实参的地址"<<&n<<endl; change1(n); cout<<"after change1() n="<<n<<endl; change2(n); cout<<"after change2() n="<<n<<endl; change3(&n); cout<<"after change3() n="<<n<<endl; return true; }
6.
7.
8.指针分配与释放一个空间
内容总结
以上是互联网集市为您收集整理的c++ 指针(三)全部内容,希望文章能够帮你解决c++ 指针(三)所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。