您好!欢迎来到源码码网

C++ Primer Plus 随记5

  • 源码教程
  • 来源:源码码网
  • 编辑:admin
  • 时间:2020-05-13 16:26
  • 阅读:543

1.C++的函数返回值不能是数组,但可以是整数、浮点数、指针、结构或对象。可以将数组作为结构或对象的组成部分来返回。


2. int arr[];


  arr[i]==*(arr+i);  &arr[i]==arr+i;


3.将数组类型和元素数量告诉数组处理函数,用两个不同的参数传递:void fillArray(int arr[], int size); 


不要用 void fillArray (int arr[size]);


4. const Size=8;


int sum_arr(int arr[], int n);


void main(){


int cook[Size]={1,2,3,4,5,6,7,8}; cout<<sizeof cook ; //显示的长度是32

int sum=sum_arr(cook,Size); }


int sum_arr( int arr[], int n){


cout<<arr; cout<<sizeof arr; //显示的长度是4, cook和arr指向同一个地址,


                                         但sizeof cook是32(整个数组的长度),sizeof arr是4(指针变量的长度)


......


}


5.保护数组,使数组视为可读数据时,用const声明


函数要修改数组,原形:void f_modify( double arr[], int n);


函数不修改数组,原形:void f_nochange(const double arr[], int n);


8.使用数组区间的函数:


const Size=8;


int sum_arr(const int * begin, const int * end);


void main(){ 


int cook[Size]={1,2,3,4,5,6,7,8};


int sum=sum_arr(cook,  cook+Size);  }


int sum_arr(const int * begin, const int * end){


int total=0;    const int * pt;  


for (pt=begin; pt!=end; pt++)


   total=total+ *pt;


}


9.一般将指针参数声明为 指向一个常量对象的指针,不能使用指针来修改所指向的值,而能修改指针指向的位置。


int age=39;


const int * pt=&age; //指向一个常量对象的指针,不能使用指针来修改所指向age的值 ,可以使pt指向其他位置  *pt+=1; (不合法)


int * const finger=&age;//指针本身为常量,不能修改指针指向的位置,但可以用finger修改age的值


以上finger, *pt是const ,*finger 和pt 不是const.


禁止将常量数组的地址赋给非常量指针,可以使用强制类型转换来突破这种限制。(P222)


10.函数与二维数组:


int data[3][4]={{1,2,3,4},{9,2,1,4},{2,4,6,3}};  int total=sum(data,3);


sum的原形: int sum( int (*arr2)[4] , int size); // (*arr2)[4] 表示由4个int组成的数组的指针  size表示行数 


            或者:int sum( int arr2[][4], int size);  //这两个原形arr2是指针而不是数组


( int *arr2[4] 表示由4个指向int的指针组成的数组。)


arr2


arr2+r


*(arr2+r)


*(arr2+r)+c


*(*(arr2+r))+c==arr2[r][c]


12.while (*str) 等价于 while (*str!="") 


#include<iostream>

char * buildstr(char c,int n);  //该函数的返回值是一个指针

int main()

{

  using namespace std;

  char ch; 

  int times;

  cout<<"Enter a character: ";

  cin>>ch;

  cout<<"Enter an integer: ";

  cin>>times;

  char * ps=buildstr(ch, times);

  cout<<ps<<endl;

  delete [] ps;  //释放指针所指内存

  ps=buildstr('+',20);  //释放后可以重新使用指针

  cout<<ps<<"Done"<<ps<<endl;

  delete [] ps;  //释放指针所指内存

  return 0;

}

char * buildstr(char c,int n) //该函数的返回值是一个指针

{

  char * pt=new char[n+1]; //用new分配动态数组

  pt[n]='';

  while(n-->0)

      pt[n]=c;

  return pt;

}

 13.函数与结构:函数返回的是结构


#include "stdafx.h"

#include<iostream>

struct travel_time

{

int hour;

int min;

};

const int mins_perh = 60;

travel_time sum(travel_time t1, travel_time t2);

void showtime(travel_time t);

using namespace std;

int main()

{

travel_time day1 = { 5, 24 };

travel_time day2 = { 6, 48 };

travel_time trip = sum(day1, day2);

cout << "Two days total: ";

showtime(trip);

 

travel_time day3= {3, 51};

cout << "There days total: ";

showtime(sum(trip, day3));

 

}

travel_time sum(travel_time t1, travel_time t2) //函数要返回一个travel_time结构,应先声明一个travel_time结构

{

travel_time total;

total.hour = t1.hour + t2.hour + (t1.min + t2.min) / mins_perh;

total.min = (t1.min + t2.min) % mins_perh;

return total;

}

void showtime(travel_time t)

{

cout << t.hour << "hours, " << t.min << "minutes. ";

}

传递结构地址时,函数不定义为由返回的类型比较方便


#include "stdafx.h"

#include<iostream>

#include<cmath>

using namespace std;

struct rect

{

double x;

double y;

};

struct polar

{

double dis;

double angle;

};

void rect_polar(const rect * pxy, polar * pda);

void showploar(const polar * pda);

int main()

{

rect zb;

polar  da;

cout << "Enter the x and y value ";

while (cin >> zb.x >> zb.y) //访问结构数据的成员用句点 .

{   

rect_polar(&zb, &da); //参数类型是指针,应对结构变量取地址

showploar(&da);

cout << "Next two number(q to quit): ";

}

return 0;

}

void rect_polar(const rect * pxy, polar * pda) //无返回值,用另一个参数来存储所需结果

{

const double rad_to_ang = 57.29577951;

pda->dis = sqrt(pxy->x*pxy->x + pxy->y*pxy->y); //访问结构指针的成员用->

pda->angle = atan2(pxy->y, pxy->x)*rad_to_ang;

}

void showploar(const polar * pda)

{

cout <<"distance="<< pda->dis << ", angle=" << pda->angle;

}

14. 声明string数组: string list[5];


 写入string数组:for(int i=0;i<5;i++)   getline( cin, list[i] );


15.函数的递归(P239例7.16)


16. 一个函数think() ,函数的名字think即为函数think()的地址


获取函数地址:process(think);  //传输think()函数的地址给process()


                        thought(think());  //传输think()函数的返回值给thought()


声明函数指针:double pam( int ); double (*pf) ( int ); pf=pam // pf是一个指向函数的指针 


double *pf ( int ) ;//表示pf() 返回是指针的函数


用指针调用函数: double x=pam(4);   double y=(*pf) (5); 或者 double y=pf (5);


17.在函数原型中参数列表const double ar[] 与const double *ar的含义相同。


自动类型判断auto只能用于简单的单只初始化,不能用于初始化列表。


(1)函数原型:


const double * f1(const double ar[], int n);


const double * f2(const double  [], int );


const double * f3(const double *, int );


(2)声明指向函数的指针:


const double * (*pa) (const double *, int )=f1; //声明一个指针,指向f1:


const double * (*pb[3]) (const double *, int )={ f1,f2,f3 }; // 声明一个指针数字,指向f1、f2、f3,并初始化:


pb是一个包含3个指针的 数组,每个指针指向一个函数,const double *, int作为参数,并返回一个const double *。


auto pa=pb;  //合法


(3)函数调用:


const double  *px=pb[0] (av,3); //av,3是参数    获取返回的值: double x=*pb[0] (av,3);


const double  *py= (*pb[0]) (av,3);                     获取返回的值: double y=*(*pb[0] ) (av,3);


18.创建指向整个指针数组的指针(P246例7.19)

————————————————


原文链接:https://blog.csdn.net/lvliang2017232003/java/article/details/85759627


特别声明:
1、如无特殊说明,内容均为本站原创发布,转载请注明出处;
2、部分转载文章已注明出处,转载目的为学习和交流,如有侵犯,请联系客服删除;
3、编辑非《源码码网》的文章均由用户编辑发布,不代表本站立场,如涉及侵犯,请联系删除;
全部评论(0)
推荐阅读
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 陀螺匠OA办公系统源码 PHP + Vue 前后端分离 完整可商用
  • 项目介绍《陀螺匠》是一套采用Laravel9框架结合Swoole高性能框架与Vue.js前端技术栈构建的AI+低代码双引擎智能办公系统。陀螺匠深度融合了AI智能体以及低代码开发平台,系统简约,易于功能扩展,方便二次开发。旨在为企业提供一站式、数智化转型的全方位解决方案,助力企业高效运营与智能决策。源码说明源码说明:项目代码100%开源,基于AGPL-3.0,支持免费商用!技术栈:系统基于Laravel9+Swoole+Vue.
  • 软件教程
  • 来源:CRMEB
  • 编辑:CRMEB
  • 时间:2026-03-27 15:33
  • 阅读:393
  • open claw最近很火,如何理性看待?
  • open claw最近很火,如何理性看待?
  • openclaw是2026年初科技圈最火爆的现象级话题。它不仅仅是又一个AI产品,更被百川智能的王小川誉为与ChatGPT诞生同等重要的里程碑——标志着AI从”只会说”的对话者,进化到了”能够做”的行动者。对于这股全民”养虾”热潮,我的观察是:它代表了一次人机关系的革命性跃迁,但同时也是一场充满风险与泡沫的狂欢,其真正的价值需要在喧嚣褪去、安全与成本的挑战被克服后才能显现。下
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-17 11:06
  • 阅读:435
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序有什么区别
  • 原生小程序和封装的小程序是两种不同的开发模式,主要区别在于开发方式、性能表现、代码维护以及跨平台能力。为了让你更清晰地理解,我们可以把“原生”比作用钢筋水泥直接盖楼,而“封装”则是用预制板或套件来组装楼。以下是详细的对比分析:1.定义与本质原生小程序:定义: 直接使用微信官方提供的开发工具、语法和API进行开发。语言: 使用微信自己定义的一套技术栈(WXML(微信标记语言)做结构、WXSS(微信样式表)做样式、JS
  • 行业资讯
  • 来源:源码码网
  • 编辑:源码码网
  • 时间:2026-03-06 11:54
  • 阅读:669
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • 基于NetCore(Razor Page)开发的Cms建站系统MIT协议
  • FytSoaCms一款基于NetCore2.2/3.1(RazorPage)功能强大的Cms建站系统,支持前后端分离。简介:模块化:全新的架构和模块化的开发机制,便于灵活扩展和二次开发。模型/栏目/分类信息体系:通过栏目和模型绑定,以及不同的模型类型,不同栏目可以实现差异化的功能,轻松实现诸如资讯、下载、讨论和图片等功能。通过分类信息和栏目绑定,可以自动建立索引表,轻松实现复杂的信息检索。FytSoa是一套基于NetCore+SqlS
  • 开发工具
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 22:21
  • 阅读:596
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • 基于JAVA开发的企业级平台微信公众号管理系统SmartWx
  • SmartWx微信公众号管理系统是一个完整的微信公众号web操作版,直接编译即可运行。让用户不再用关心微信的底层接口,直接使用页面进行操作,简单方便。包括服务器绑定、文本管理、图文管理、菜单管理、粉丝管理、群发消息等。技术框架开发语言:JAVA数据库:MYSQLJAVA开发框架:SpringMVC+Spring+Mybatis缓存框架:j2cache前端开发框架:Layui+JQuery+html前台模板引擎:art-templat
  • 源码教程
  • 来源:gitee
  • 编辑:源码码网
  • 时间:2026-01-24 21:53
  • 阅读:602
联系客服
源码代售 源码咨询 技术开发 联系客服
029-84538663
手机版

扫一扫进手机版
返回顶部