1.二维数组的聚合赋值
#include<bits/stdc++.h>
using namespace std;
int main(){
//聚合方式赋值
int a[3][2] = {{1,2},{3,4},{5,6}};
//只会按照行优先的方式赋值第一行,缺省值为0
int b[3][2] = {1,2};
return 0;
}
2.字符串处理函数
1)strcat()函数-字符串连接函数
strcat(字符数组名1,字符数组名2)
作用:将字符数组2连接到字符数组1中字符串的后面,并且删去字符串1后的串结束标志"\0"
#include<bits/stdc++.h>
using namespace std;
const int maxn = 106;
int main(){
char ch1[maxn],ch2[maxn];
gets(ch1),gets(ch2);
strcat(ch1,ch2);
cout<< ch1 <<endl;
return 0;
}
//123 456
//78
//123 45678
注意:字符数组1的容量一定要足够装下两者的和,否则无法装下连接后的字符串,但是刚刚试了试,发现好像可以装下去,不懂了qwq
#include<bits/stdc++.h>
using namespace std;
int main(){
char ch1[3] = {'a','b'};
char ch2[3] = {'A','B'};
cout<< ch1 <<endl;
cout<< ch2 <<endl;
strcat(ch1,ch2);
cout<< ch1 <<endl;
return 0;
}
//ab
//AB
//abAB
2)strcpy()函数-字符串复制函数
strcpy(字符数组1,字符数组2)
作用:将字符数组2中的字符串复制到字符数组1中,包括结束标志"\0"
注意:1.字符数组1有足够长度
2.字符数组1必须是字符数组名,而字符数组2可以是一个字符串常量
#include<bits/stdc++.h>
using namespace std;
int main(){
char ch1[10];
strcpy(ch1,"123");
cout<< ch1 <<endl;
return 0;
}
//123
3)strcmp()函数-字符串比较函数
strcmp(字符数组名1,字符数组名2)
//按照ASCII码顺序比较
if 1 = 2 return 0
if 1 > 2 return +|x|
if 1 < 2 return -|x|
4)strlen()函数-获取字符串长度(实际长度)
strlen(字符数组名)//不包含字符串结束标志
#include<bits/stdc++.h>
using namespace std;
int main(){
char ch1[10] = {'1','2'};
cout<< strlen(ch1) <<endl;
return 0;
}
//2
3.指针
1)指针的赋值
1.初始化的赋值
int a = 1;
int *p = &a;
2.后期赋值
int a = 1;
p = &a;
2)指针运算符和取地址运算符
1.“ * ”是取值运算符
2.“ & ”是取地址运算符
&*p 和 *&a的区别(p = &a):两者优先级相同,按照自右向左的方向结合
&*p相当于取变量a的地址,而*&a相当于变量a
3)空指针
void *p;
可以接受任何类型的数据,可以强制转换为所对应的数据类型。
4)指向常量的指针与指针常量
int a = 1;
int * const p = &a;
/* 指针常量
* 指针常量表示这个指针的指向是不可以改变的,但是可以改变它指向内存的内容
*/
int const* p = &a;
/* 指向常量的指针
* 指针的指向可以改变,但是通过该指针是不能够修改内容的(其它非指向常量的指针可以改变)
*/
5)数组与指针的联系
数组名其实是一个指针常量
通过指针操作数组的等价含义:
*(p--) = a[i--]
*(++p) = a[++i]
*(--p) = a[--i]
ex:利用指针变量遍历二维数组
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[2][2] = {1,2,3,4};
int *p;
p = a[0];
for(int i = 0;i < sizeof(a)/sizeof(int);i++){
cout<< "address: " << a[i] << " is " << *p++ <<endl;
}
return 0;
}
//address: 0x6dfec8 is 1
//address: 0x6dfed0 is 2
//address: 0x6dfed8 is 3
//address: 0x6dfee0 is 4
二维数组的原理:
#include<bits/stdc++.h>
using namespace std;
int main() {
int a[3][4];
int (*b)[4]; //定义一个数组指针,可以指向一个含有4个整型变量的数组
int *c[4]; //定义一个指针数组,储存指针的数组,最多只能储存4个指针
int *p;
p = a[0]; //让p指向数组a的第0行的行地址
b = a; //让b指向数组a
cout<< "利用连续内存的特点,使用int指针将二维int数组初始化" <<endl;
{
for(int i = 0; i<12; i++) { //初始化二维数组
*(p+i) = i + 1; //给第i行首元素赋值
cout<<a[i/4][i%4]<<",";
if((i+1)%4 == 0) { //每4列换行
cout<<endl;
}
}
}
cout<<"使用指向数组的指针,二维数组的值改变"<<endl;
{
for(int i = 0; i<3; i++) {
for(int j = 0; j<4; j++) {
*(*(b+i)+j) += 10; //通过数组指针修改二维数组内容
}
}
}
cout<<"使用指针数组,再次输出二维数组"<<endl;
{
for(int i= 0; i<3; i++) {
for(int j = 0; j<4; j++) {
c[j] = &a[i][j]; //用指针数组里的指针指向a[i][j]
cout<<*(c[j])<<",";
if((j+1)%4 == 0) { //每4列换行
cout<<endl;
}
}
}
}
return 0;
}
6)指针在函数中的应用-指针函数
指向函数的指针
#include <bits/stdc++.h>
using namespace std;
int avg(int a,int b);
int main() {
int i,j,ipResult,ifResult;
i = 10;
j = 30;
int (*pFun)(int ,int );//定义函数指针
pFun = avg;
ifResult = avg(i,j);
ipResult = (*pFun)(i,j);
cout<< ifResult <<endl;
cout << ipResult <<endl;
return 0;
}
int avg(int a,int b) {
return (a + b) / 2;
}
//20
//20
从函数中返回指针
int* function(形式参数表){
...;
return p;
}
7)指针数组
int *p[4];
int *(*p);
4.引用
引用-C++11标准中提出左值引用,不加声明的情况下,引用一般指的就是左值引用
引用实际上是一种隐式指针,形式:
int a = 10;
int &ia = a;//别名
ia = 2;
说明:
1.一个C++引用被初始化后,无法使用它再去引用另一个对象,它不能被重新约束
2.引用变量只是其它对象的别名,对其操作等同于对所引用对象的操作
3.指针变量与引用主要有两点区别:一是指针是一种数据类型,而引用不是一种数据类型,指针可以转换成它所指向变量的数据类型,以便赋值运算符两边的类型匹配,而在使用引用的时候,系统要求引用和变量的数据类型必须相同,不能进行数据类型的转换。二是指针变量的语法更为复杂一些,而定义引用变量之后,使用方法与普通变量一样。
4.引用必须初始化,否则会报错
·命令参数
main(int argc,char *argv[])
main()函数中的参数可以获取程序运行的命令参数,命令参数就是执行应用程序时后面带的参数,例如cmd控制台中的dir /w,/w参数就是以多列的形式显示出文件夹内的文件名,main()中的参数argc是获取命令参数的个数,argv是字符指针数组,可以获取具体的命令参数
#include<iostream>
using namespace std;
int main(int argc,char *argv[]){
cout << "the list of parameter:" << endl;
while(argc>1){
++argv;
cout << *argv << endl;
--argc;
}
return 0;
}