5数组
5.1数组概念
5.2一维数组
int a[10];
常量表达式中不能包含变量。
在定义数组时分别对数组元素赋予初值。
int a[10]={0,1,2,3,4,5,6,7,8,9};
在对全部数组元素赋初值时,可以不指定数组长度。
int a[]={1,2,3,4,5};
5.3二维数组
类型标识符 数组名 [常量表达式] [常量表达式]
float a[3][4],b[5][10];
在使用数组元素时,应该注意下标值应在已定义的数组大小的范围内。
二维数组初始化 (一行对一行,界限清楚。 )
int a[3][4]={{1,2,3,4},{5,6,7,8},{9,10,11,12}};
如果对全部元素都赋初值 ,则定义数组时对第一维的长度可以不指定,但第二维的长度不能省。
int a[][4]={1,2,3,4,5,6,7,8,9,10,11,12};
5.4数组名作函数参数
数组元素作为函数的实参,与用变量作实参一样。
用数组名作函数参数,此时实参与形参都用数组名。 实参数组与形参数组类型应一致 ,用数组名作函数实参时, 只是将实参数组首元素的地址传递给形参。
用数组名作函数实参时,改变形参数组元素的值将同时改变实参数组元素的值。
select_sort(a,10);
如果用二维数组名作为实参和形参,在对形参数组声明时,必须指定第二
维(即列)的大小,且应与实参的第二维的大小相同。
int score[5][10];//实参
int array[3][10];//形参
在第二维大小相同的前提下,形参数组的第一维可以与实参数组不同,系统不检查第一维的大小。
5.5字符数组
char c[10]={′ I′ ,′ ′ ,′ a′ ,′ m′ ,′ ′ ,′ h′ ,′ a′ ,′ p′ ,′
p′ ,′ y′ };
花括号中提供的初值个数大于数组长度,则按语法错误处理。
只能对字符数组的元素赋值,而不能用赋值语句对整个数组赋值 。
遇到字符==′ \0′==就表示字符串到此结束,由它前面的字符组成字符串。
char str[]={″ I am happy″ };
或
char str[]=″ I am happy″ ;
字符数组的输入输出可以有两种方法:
(1) 逐个字符输入输出。
(2) 将整个字符串一次输入或输出。
char str[20];
cin>>str;//用字符数组名输入字符串
cout<<str; //用字符数组名输出字符串
字符串连接函数 :将第二个字符数组中的字符串连接到前面字符数组的字符
串的后面。
strcat(char[],const char[]);
字符串复制函数 ,将第二个字符数组中的字符串复制到第一个字符数组中去。
strcpy(char[],const char[]);
字符串比较函数 ,只参加比较而不应改变其内容,因此两个参数都加上const 声明。
strcmp(const char[],const char[]);
(1) 如果字符串 1=字符串 2,函数值为 0。
(2) 如果字符串 1>字符串 2,函数值为一正整数。
(3) 如果字符串 1<字符串 2,函数值为一负整数
字符串长度函数 ,测试字符串长度 。为字符串中的实际长度,不包括′ \0′在内。
strlen(const char[]);
5.6处理字符串的方法
字符串变量 ,使用时将string 头文件包含进来 。在定义字符串变量时不需指定长度,长度随其中的字符串长度而改变。
string string1;
例如
string string2=″ China″ ;
字符串变量的输入输出
cin>> string1; //从键盘输入一个字符串给字符串变量 string1
cout<< string2; //将字符串 string2 输出
string 类对象运算时,直接用简单的运算符。
字符串数组 ,在字符串变量中存放的是字符串的地址。
string name[5]; //定义一个字符串数组,它包含 5 个字符串元素
string name[5]={″ Zhang″ ,″ Li″ ,″ Fun″ ,″ Wang″ ,″ Tan″ };
//定义一个字符串数组并初始化
6指针
6.1指针概念
专门用来存放另一变量地址(即指针)的,则它称为指针变量。 指针变量的值(即指针变量中存放的值)是地址(即指针)。
6.2变量与指针
用*符号表示指向 ,i_pointer 是一个指针变量。*i_pointer 表示 i_pointer 所指向的变量。
指针变量 定义
基类型 指针变量名; ""不是指针变量名的一部分,在定义变量时在变量名前加一个“*”表示该变量是指针变量。
指针变量的基类型用来指定该指针变量可以指向的变量的类型。
将被指向的变量的地址赋给指针变量 。&为取地址符。
pointer_1=&i;//将变量 i 的地址存放到指针变量pointer_1 中
pointer_2=&j; //将变量 j 的地址存放到指针变量pointer_2 中
&*pointer_1 与&a 相同, *&a 与 a 等价 。
函数的参数 可以是指针类型。 作用是将一个变量的地址传送给被调用函数的形参。
虚实结合是采取单向的“值传递”方式,只能从实参向形参传数据,形参值的改变无法回传给实参 。
6.3数组与指针
int *p;
p=&a[0];
或
p=a;
如果 p 的初值为&a[0]
- p+i (a+i)就是 a[i]的地址 。
*(p+i)
是p+i
所指向的数组元素,即 a[i]。- p[i]与*(p+i)等价。
(1)p++
(或 p+=1
)。 使 p 指向下一元素,即 a[1]。
(2) *p++
。 先得到 p 指向的变量的值(即*p),然后再使 p 的值加 1。
(3)*(p++)
与*(++p)
作用不同。 前者是先取p 值,然后使 p 加 1。 后者是
先使 p 加 1,再取p。
(4) (*p)++表示 p 所指向的元素值加 1, 是元素值加 1,而不是指针值加 1。
(5) 如果 p 当前指向 a[i],则*(p--)
先对 p 进行“”运算,得到 a[i],再使 p 减 1,p 指向 a[i-1]。*(++p)
先使 p 自加 1,再作运算,得到 a[i+1]。*(--p)
先使 p 自减 1,再作*运算,得到 a[i-1]。
*(*(a+i)+j)
是 a[i][j]
的值 。
int *p[4]
; //定义一个指针数组,该数组中每个元素是一个指针,每个指针指向哪里就需要程序中后续再定义了
int (*p)[4]
; //定义一个数组指针,该指针指向含4个元素的一维数组(数组中每个元素是int型)。
6.4字符串与指针
- 用字符数组存放一个字符串
- 用字符串变量存放字符串
- 用字符指针指向一个字符串
6.5函数与指针
-
用函数指针变量调用函数 。用一个指针变量指向 max 函数,然后通过该指针变量调用此函数。
int (*p) (int,int); int max(int,int);//原函数
只是用(*p)取代了 max,其他都一样。
-
用指向函数的指针作函数参数
double integral (double a,double b,double (*fun)(double));
6.6返回指针的值的函数
函数可以带回一个指针型的数据,即地址。
定义指针函数的一般形式为
int *a(int x,int y);
6.7指针数组和指向指针的指针
指针数组中的每一个元素相当于一个指针变量,它的值都是地址。
int *p[4];
p=*(name+i++);
*(name+i++)
表示先求*(name+i)
的值,即 name[i]
(它是一个地址)。 将它赋给p
,然后 i 加 1。 最后输出以p
地址开始的字符串。
指向指针的指针
char *(*p);或者
char **p;
利用指针变量访问另一个变量就是“间接访问”。 如果在一个指针变量中存放一个目标变量的地址,这就是“单级间址”, 指向指针的指针用的是“二级间址”方法。
6.8指针类型和运算小结
(1) 指针变量加/减 一个整数 。p+i 指向 p 下面的第 i 个元素。
(2) 指针变量赋值 。
p=&a; //将变量 a 的地址赋给 p
p=array; //将数组 array 首元素的地址赋给 p
p=&array[i]; //将数组 array 第 i 个元素的地址赋给 p
p=max; //max 为已定义的函数,将 max 的入口地址赋给
p
p1=p2; //p1 和 p2 都是同类型的指针变量,将 p2 的值赋给 p1
(3) 指针变量可以有空值。p=NULL;
(4) 两个指针变量可以相减 。两个指针变量值之差是两个指针之间的元素个数。但 p1+p2
并无实际意义。
(5) 两个指针变量比较 。指向前面的元素的指针变量小于指向后面元素的指针变量。如果 p1
和 p2
不指向同一数组则比较无意义。
6.9引用
引用是一种新的变量类型,它的作用是为一个变量起一个别名。
int a; //定义 a 是整型变量
int &b=a; //声明 b 是 a 的引用,a 或 b 的作用相同,都代表同一变量.
在声明一个引用类型变量时,必须同时使之初始化,即声明它代表哪一个变量。
引用后 ,不能再作为其他变量的引用(别名)。
C++之所以增加引用类型, 主要是把它作为函数参数,以扩充函数传递数据的功能。
(1) 将变量名作为实参和形参。
(2) 传递变量的指针。
(3)传送变量的别名。
#include <iostream>
using namespace std;
int main( )
{ void swap(int &,int &);
int i=3,j=5;
swap(i,j);//调用时不必用地址,直接用变量名
cout<<″ i=″ <<i<<″ ″ <<″ j=″ <<j<<endl;
return 0;
}
void swap(int &a,int &b) //形参是引用类型
{ int temp;
temp=a;
a=b;
b=temp;
}
来源:https://blog.csdn.net/qq_28691955/article/details/100030813