C++学习笔记1
(1)数组声明使用数组名来标记存储位置;对数组名使用sizeof将得到整个数组的长度;将地址运算符&用于数组名时,将得到整个数组的地址。
(2)恒等公式:
arr[i]=*(arr+i);
&arr[i]=arr+i;
将指针加1,相当于将指针移动了指针所指类型相等的长度
(3)使用new和delete来创建动态数组
#include<iostream>
#include<cstring>
using namespace std;
char* getname();
int main(void)
{
char *name;
name=getname();
cout<<name<<" at "<<&name<<endl;
delete [] name;
name=getname();
cout<<name<<" at "<<&name<<endl;
delete [] name;
system("pause");
return 0;
}
char* getname()
{
char temp[100];
cout<<"Enter last name:";
cin>>temp;
char* p=new char[strlen(temp)+1];
strcpy(p,temp);
return p;
}
(4)continue语句用于循环中,让程序跳过循环体中余下的代码,直接进行下一次的循环判断;
break语句用将程序跳出switch或for循环,执行他们后面的语句。
(5)C++按值传递数据,函数使用的是数据的副本,但是,接受数组名的函数将使用原始的数据。因此为了防止数组中的值被修改,使用const int arr[]或const int *arr作为函数的参数,如:void fun(const int *arr,int n)
(6)队输入参数进行检查并且避免恶意输入的代码
cin>>temp;
if(!cin) //bad input
{
cin.clear();
while(cin.get()!='\n') continue;
cout<<"Bad input, input process will terminated.\n";
break;
}
(7) int a=10;
const int * pt=&a; //pt是一个指向整型常量的指针,pt可以 变,但是*pt不能变
int * const pt_1=&a; //pt_1是一个指向整型的常量指针,pt_1不能变,但是*pt_1可以变
const int * const pt_2=&a; //pt_2和*pt_2都是常量,不能变
(8)与数组名不同的是,数组名是数组第一个元素的地址,结构名只是结构的名称,要获得结构的地址,必须使用&; 可以将一个结构赋值给另一个结构,但是不能将一个数组赋值给另一个数组
(9)函数名就是函数的地址;函数指针的使用方法示例:
double pam(int i);
double (*pfun)(int); //pfun points to a function with a int arguement that returns double
pfun=pam;
double y=(*pfun)(4); //or double y=pfun(4);
C++自动类型推断:
auto pfun_1=pam; //C++中,pfun_1的作用等同于pfun
(10)对于 int pa[10];
pa是数组第一个元素的地址,即&pa[0]; 而&pa是整个数组(即十个个int元素块)的地址,数值上他们相等,但是他们的类型不同,一种差别是,pa+1是数组中第二个元素的地址,而&pa+1是数组pa后面第十个元素的地址,另一个差别是,要得到第一个元素的值得操作为:`pa[0]=*pa=**&pa;
引用
(1)引用是已定义的变量的别名(另一种名称)
int rats;
int & rods=rats; //makes rods an alias for rats; rats 和rods指向相同的值和内存单元
它的主要作用是用作函数的形参,通过将引用变量用作参数,函数将使用原始数据,而不是其副本。
int a,b;
a=10;
b=20;
void cal(int& x,int& y)
{
x=x*x;
y=y*y;
}
cal(a,b);
必须在声明引用变量时进行初始化;可以通过初始化来设置引用,但是不能通过赋值来设置;
(2)左值是可被引用的数据对象,例如:变量,数组元素,结构成员,引用和解除引用的指针;在赋值语句中,左边必须是可以修改的左值,即,在赋值表达式中,左边的子表达式必须标识一个可修改的内存块;
(3)
struct stu
{
std::string name;
int number;
};
stu& deal(stu& target,const stu& source);
deal(student,student_01)=studeng_02; //deal 函数的返回值在可修改的内存板块里,所以可以为左值,可以修改。
常规(非引用)函数返回类型是右值,因为这种返回值位于临时内存单元中;
(4)如果数据对象是数组,则只能使用指针;如果数据对象是结构,则使用引用或指针;如果数据对象是类对象,则使用引用;
(5)使用引用结构作为函数的参数时,若结构中有指针成员变量,可以先不初始化,可以在函数中申请空间(new),但是要记得使用完后要delete