我的隨行筆記5 C++ Primer Plus
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!="\0")
#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]='\0';
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.\n";
}
傳遞結構地址時,函式不定義為由返回的型別比較方便
#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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/30239065/viewspace-2715655/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 我的隨行筆記11 C++ Primer Plus筆記C++
- 我的隨行筆記10 C++ Primer Plus筆記C++
- 我的隨行筆記9 C++ Primer Plus筆記C++
- 我的隨行筆記8 C++ Primer Plus筆記C++
- 我的隨行筆記6 C++ Primer Plus筆記C++
- 我的隨行筆記7 C++ Primer Plus筆記C++
- 我的隨行筆記4 C++ Primer Plus筆記C++
- 我的隨行筆記2 C++ Primer Plus筆記C++
- 我的隨行筆記3 C++ Primer Plus 3--指標筆記C++指標
- C++ Primer Plus隨記1C++
- C++ Primer Plus 隨記(第八章)C++
- C++ primer Plus學習筆記(第二章)C++筆記
- C++ Primer筆記C++筆記
- C++ Primer Plus(一)C++
- C++ Primer Plus(四)C++
- C++ Primer Plus(三)C++
- 【C++ Primer Plus】學習筆記--第10章 物件和類C++筆記物件
- C++ Primer 5th筆記(5)chapter5 語句C++筆記APT
- C++ Primer Plus 第四章 複合型別 學習筆記C++型別筆記
- C++ Primer Plus 第六版C++
- 筆記:《C++ Primer 中文版(第5版)》 第1章 開始筆記C++
- c++ primer 第二章閱讀筆記C++筆記
- element-plus隨筆
- 《C++ Primer》學習筆記(八):標準 IO 庫C++筆記
- 《C++ Primer》學習筆記(六):C++模組設計——函式C++筆記函式
- C Primer Plus(三)
- 《C++ Primer中文版(第5版)》學習筆記與習題完整發布!C++筆記
- 黑馬筆記--C++基礎篇--隨筆筆記C++
- C++ Primer(英語第5版) 閱讀日記 - 20201222C++
- 《C++ Primer》讀書筆記(第一章 開始)C++筆記
- C++ Primer 第二章 學習筆記及習題答案C++筆記
- C++ Primer plus 第12章類和動態記憶體分配複習題參考答案C++記憶體
- 隨筆記筆記
- 《C Primer Plus》,362頁勘誤
- C Primer Plus(中文版)(第5版)電子書pdf下載
- c++ primer 之stringC++
- 隨堂筆記筆記
- 隨記筆記未整理筆記