C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计
编程技能 a C++语言程序设计
(三)指针与数组 指针和数组 数组名本身就是地址 指针和数组名联系起来,可通过指针访问数组 虽然一维数组名和二维数组名都是地址,都可以看做某种指针,但是指针的类型是不同的 通过指针访问一维数组和二维数组的方法是不同的 C++语言程序设计
一维数组名可以看做指针,它具有以下特点: (三)指针与数组 一维数组名可以看做指针,它具有以下特点: 指针的类型是指向数组元素的指针 数组名也是数组第一个元素的地址 对于一维数组A来说,数组名A和&A[0]具有相同的类型和相同的值 通过数组名的间接引用运算,如*A,就可以访问数组的第一个元素A[0] 数组名所包含的地址值是不可改变的,是一种指针常量 C++语言程序设计
(三)指针与数组 通过指针访问一维数组 首先声明一个和数组类型相同的指针,并且用数组名来对指针初始化 例如:int A[5], *pa=A; 通过数组名或者所定义的指针变量,用多种方式访问数组元素 数组名和下标,如:A[0]、A[4] 指针和下标,如:pa[0]、pa[4] 指针加偏移量的间接引用,如:*(pa+0)、*(pa+4) 数组名加偏移量的间接引用,如:*(A+0)、*(A+4) 指针自增后的间接引用,如:*pa++ 注意:不允许数组名自加后的间接引用来访问数组元素 *A++访问数组元素是不允许的,因为数组名是指针常量 C++语言程序设计
(三)指针与数组 例:求整型数组的平均值 C++语言程序设计 注意:在使用“指针自增后的间接引用”的方法访问一维数组时,指针本身的地址值是变化的 //通过指针求整型数组的平均值 #include <iostream> using namespace std; void main() { int intArray[10]={8,11,23,34,45,56,65 ,78,86,97}; int i,num,sum=0; float average; int *ptint=intArray; //定义指针并初始化 //求数组元素的数目 num=sizeof(intArray)/sizeof(*intArray); for(i=0;i<num;i++) sum=sum+*ptint++; average=(float)sum/num; //指针指向数组第一个元素 ptint=intArray; cout<<"数组元素是:\n"; cout<<*ptint++<<" "; cout<<"\n平均值是:“ <<average<<endl; } 需要对指针重新初始化 C++语言程序设计
二维数组名可以看做指针,它具有以下特点: (三)指针与数组 二维数组名可以看做指针,它具有以下特点: 二维数组可以看成是一维数组的一维数组 对于二维数组char B[3][4],数组名B是其中第一个一维数组B[0]的地址,B+1就是下一个一维数组B[1]的地址 数组名B是指向一维数组的指针,所指向的一维数组的大小是4 数组名C是指向一维数组的指针,所指向的一维数组的大小是2 C++语言程序设计
(三)指针与数组 通过指针访问二维数组 首先声明一个指向一维数组的指针,并且用数组名来对指针初始化 格式: <类型名> (*指针变量名)[一维数组大小]; 例如:char B[3][4],C[3][2] ; char (*ptchb)[4]=B; char (*ptchc)[2]=C; 用指向一维数组指针访问第i行j列的数组元素:*(*(指针名+i)+j) 指针名:第0行的地址 指针名+i:第i行的地址 *(指针名+i):第i行第0列的地址 *(指针名+i)+j:第i行第j列的地址 *(*(指针名+i)+j):第i行第j列的数组元素 C++语言程序设计
例:用单循环程序,求二维数组元素的平均值 (三)指针与数组 例:用单循环程序,求二维数组元素的平均值 分析: 程序把二维数组dArray看成是一维数组 一维数组的首地址是 *pt( 实际是*dArray) 数组元素的地址是 *pt+i(0≤i<j) //用单循环程序,求二维数组元素的平均值 #include <iostream> using namespace std; void main() { int dArray[3][4]={32,42,12,25,56,76, 46,53,76,89,96,82}; int sum=0, j; float average; //**dArray就是元素 dArray[0][0] j=sizeof(dArray)/sizeof(**dArray); //定义指向一维数组的指针并初始化 int (*pt) [4]=dArray; for(int i=0;i<j;i++) sum=sum+*(*pt+i); average=(float)sum/j; cout<<“数据的平均值等于:” <<average<<endl; } C++语言程序设计
(三)指针与数组 指针数组 若数组元素是某种类型的指针,称这样的数组为指针数组 声明格式:<类型> *<数组名>[常量表达式]; 例如:char *member_name[10]; 字符指针数组: 例如:char *member_name[]={"Merry", "John", "Hill"}; 数组元素是指向一些不同长度的字符串常量的字符指针 如果定义一个指向数组元素的指针,则能够通过指针来访问其中的字符串 例如:char **pm=member_name; cout<<*pm<<endl; //显示: Merry C++语言程序设计
(三)指针与数组 例:指针数组及其访问程序 C++语言程序设计 //指针数组及其访问程序 #include <iostream> using namespace std; void main() { char *member_name[]={"Merry", "John", "Hill"}; cout << "The namelist show as:\n"; for ( int i = 0; i < 3; ++i ) cout << member_name [ i ] << '\n'; } C++语言程序设计
(三)指针与数组 指针数组作main函数的形参 为了在运行C++程序时,可以由用户提供执行程序所需要的参数,可以在程序中使用C++命令行参数 带有命令行参数的main函数的原型是: <类型> main(int argc, char *argv[]); argc:整数,存放命令行参数的数目,由程序自动统计,包括所执行的程序名 命令行参数都看做是字符串 argv[]:字符指针数组,存放各个字符串的地址 argv[0]指向执行的程序名字符串 argv[argc-1]指向最后一个输入的参数字符串 argv[argc]中自动存入NULL,表示输入结束 C++语言程序设计
(三)指针与数组 例:显示命令行参数 C++语言程序设计 //显示命令行参数 #include <iostream> using namespace std; void main( int argc, char *argv[] ) { cout << "共输入了"<< argc <<"个参数,分别是:\n"; for ( int i = 0; i < argc; ++i ) cout << argv[ i ] << ' '; } C++语言程序设计