遇到的问题
- 格式化输入输出流,c能接受十进制、八进制、十六进制,c++能接受除十进制外的其他数据嘛?
答:能,c++>>oct; 开启八进制输入
要点
- 定义不确定长度数组时,有的编译器可以实现这种代码
int n;
cin>>n;
int a[n];
这样有的编译器虽然能运行,但是是不符合正统语法规范的,因为定义数组时,数组长度必须是常量或者常量表达式,不能是变量;如果像定义一个边长数组,需要用new或者malloc语句动态分配内存才行。
- 数组指针和指针数组:
数组指针,他是一个指针,落脚点是指针,类比整形指针、字符型指针一样,数组指针就是数组型指针,它指向的是一整个数组,用它可以表示二维数组的行,前提该指针指向的一整个数组,这个数组的长度要和二维数组的列长度一样。
用法:
int (* arrPtr)[10] = NULL; // 一个指针,它指向一个有10个int元素的数组
int matrix[3][10]; // 3行,10列的数组, 数组名称是一个指向第一个元素的指针,也就是第一行的指针
arrPtr = matrix; // 使得arrPtr指向矩阵的第一行
(*arrPtr)[0] = 5; // 将5赋值给第一行的第一个元素
arrPtr[2][9] = 6; // 将6赋值给最后一行的最后一个元素,表示具体位置的
++arrPtr; // 将指针移动到下一行,这个指针,一加,加的是一行
(*arrPtr)[0] = 7; // 由于上一步,指针移动到第二行,将7赋值给第二行的第一个元素!!!
指针数组,它是一个内部元素全是指针类型的数组。常用它来表示一个二维数组或者保存多个长字符串,它可以节省很多空间。
用法:
char *myStrPtr[5] = // char指针的数组
{ // 墨菲定律的几条推论:
“会出错的事,总会出错。”
“世上没有绝对正确的事情。”
“每个解决办法都会衍生出新的问题。”
};
- 函数指针和指针型函数,这两个和上文提到的数组指针、指针型数组有异曲同工之妙,甚至定义时的样子也相似。
int (*p) [10]; //这是函数指针,该指针指向的是一整个数组
int *p[10]; //这是指针数组,它内部的十个元素全是指针型的
int (*p) (int,int) //这是函数指针,它指向一个函数的首地址
int *p(int,int) //这是一个指针型函数,重点:函数!它的返回值是一个指针
- 二维数组的定义,不论是变量的定义还是当作函数的形参,二维长度都要写,一维可写可不写
- 指针不能直接当变量用:cin>>输入,只有当他指向一个变量,它才可以当作一个变量(*p)用
int *p;
int a;
p=&a; //这一步之后,才有下面两部,否则报错
cin>>*p;
cout<<*p;
-
两块内容相同的书写格式,指针和引用,他们都有各自的说明符,指针是*,引用时&,这个说明符不属于变量名也不属于类型名,他是独立的,也就是说,下面三者是等价的
int * p; int* p; int *p;
-
函数参数,数组传参时,函数中对数组的修改会对实参产生影响(数组≈指针);指针传参,对指针的修改会在main函数中有影响
void swap(int *p,int *q){ int temp; temp=*p; *p=*q; *q=temp; } int main(){ int a=10,b=5; swap(&a,&b); //a和b的值会被调换 }