《C++指针与数组.doc》由会员分享,可在线阅读,更多相关《C++指针与数组.doc(13页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、C+ 指针与数组(C+初学者)史上最低价抢购名牌正品女士保暖内衣!clostyle洛黛尔_兰精莫代尔轻塑身女士保暖内衣套装!C+ 指针与数组(C+初学者)1. 指针的概念变量的地址称为该变量的指针,存放指针的变量称为指针变量。指针变量是一种变量,它存放其他变量的地址值。如 int i; int *pi=&i; 则pi变量的值就是变量i的地址。指针前面加*,表示指针所指向的内存单元。如 int i,j; int *pi; pi=&i; i=9; j=*pi; 则此时j和i的值相同 指针变量是一种4字节的变量,任何类型的指针变量,在Win32平台下,它占用的内存大小均为4个字节,如 int *pi
2、; char *pch; double *pf WORD *pw; 则sizeof(pi)=sizeof(pch)=sizeof(pf)=sizeof(pw) 指针变量本身的值改变,并不会引起它原来指向的变量的值发生改变。如 int i,j; int *pi; i=8; pi=&i; j=9; pi=&j; 则i的值始终为8 通常情况下,不允许直接为指针赋常量值。为防止调用未初始化的指针,通常在未给指针赋值之前,将指针初始化未NULL; int *pi=NULL; (正确) pi=(int *)0x;(不适宜)指针可以作为函数的参数,如 void Swap(int *pi1,int *pi2)
3、 int iTemp=*pi1; *pi1=*pi2; *pi2=iTemp; int i,j; i=1; j=2; Swap(&i,&j);分析下面函数 void Swap(int *pi1,int *pi2) int *iTemp=pi1; pi1=pi2; pi2=iTemp; 指向指针的指针。指向指针的指针同样是一种指针变量,同样占用4个字节,只不过它存放的值是其他指针的地址,它用 *表示,如 int iData; int *piData; int *ppiData; iData=100; piData=&iData; ppiData=&piData; cout*ppiDataendl
4、;2. 指针的运算指针变量加/减一个整数n,所得值仍然为指针,表示指针向前/向后移动n个元素如 int i=0x0f30348a; int *pi; char *pch=(char *)(&i); char *pch2=pch+1; pi=(int *)pch+1;两个指针变量相减,表示两个指针之间的元素的个数,两个指针变量相减,则指针变量类型必须相同,如 int i=0x0f30348a; char *pch=(char *)(&i); char *pch2=pch+1; int iEleCount=pch2-pch;两个指针间相加,无实际意义。两个指针的比较,表示两个指针指向的变量的地址的
5、比较。两个指针的类型必须相同。如 char ch1=a; char ch2=b; char *pch1=&ch1; char *pch2=&ch2; coutpch2)endl; 3. 引用引用是给变量名取一个别名,对引用的使用完全等价于对原有变量的使用。在声明一个引用变量的同时,必须对其进行初始化,初始 化后,引用不能再作为其他变量的引用,如 int i,j; int &iAlias=i; &iAlias=j; (错误)例1: int a=10; int &b=a; a=a*a; coutaendl; coutbendl; cout&bendl;例2: void Swap(int &a,in
6、t &b) int iTemp=a; a=b; b=iTemp; 引用声明与地址操作符的区别。当&前面有类型标识符时,它必然是对引用的声明,如int &i,除此之外都是取变量的地址,如 cout&i;4. 数组数组是一组具有相同数据类型的有序数据的集合,在内存中表现为一块连续的存储区域。引入数组可以大大减少程序中变量的数量, 使程序精练,而且数组含义清楚,使用方便,明确反映了数据间的关系。4.1. 一维数组定义一维数组的一般格式为类型标识符 数组名常量表达式;如 int iQuantitys10; int iQuantitys2*5; int iQuantitys2*n;表示数组个数的表达式必
7、须为常量表达式。引用数组元素的表示形式为数组名下标下标可以是结果为整型的常量或者表达式。 int iRands7; for(int i=0;i7;i+) iRandsi=int(rand(); coutsetw(10)iRandsi; coutendl-=0;i-) coutsetw(10)iRandsi; coutendl;一维数组的初始化1、在定义数组时,用给数组赋予初值,内元素的个数不能多于声明中的元素个数,但是可以比声明中的元素个数少,没有初始化 的元素将赋值为0。 int iArray4=1,2,3,4; int iArray4=1,2,3,4,5; /(错误) int iArray
8、4=0; char szText4=0;2、在对全部数组元素赋初值时,可以不指定数组的长度,如 int iArray=1,2,3,4;可以通过 int iCount=sizeof(iArray)/sizeof(int);求出元素的个数3、给数组所有元素赋相同的初值。 char szText8; int iArray3; memset(szText,0,sizeof(szText); memset(szText,a,sizeof(szText); memset(iArray,0,sizeof(iArray); memset(iArray,9,sizeof(iArray);/(容易产生问题!)示例
9、,冒泡法排序int a10;int i,j,t;coutinput 10 numbers:endl;for(i=0;iai;coutendl;for(i=0;i9;i+) for(j=0;jaj+1) t=aj; aj=aj+1; aj+1=t; coutthe sorts numbers:endl;for(i=0;i10;i+) coutai ;coutendl;练习:int iArray=1,2,3,7,8,9;/将iArray数组的元素反序存放。二维数组定义二维数组的一般形式为类型标识符 数组名常量表达式常量表达式例如double fMatrixMN;二维数组可以看作是一个M行N列的表格
10、,也可以看成是一个有M个元素的一维数组,该数组的每个元素也是一个一维数组.在内存中,多维数组同样是一片连续的存储区域,理解下面数组的存放顺序int iMx23=1,2,3,2,5,6;二维数组的初始化1、可以在声明数组时用,的方式赋初值,如int iMx23=1,2,3,2,5,6;2、可以按一维数组的方式赋值int iMx23=1,2,3,2,5,6;3、可以对行或者列部分赋值int iMx23=1,2,5;4、如果对数组全部赋初始值,则行的大小可以省略,列的大小不能省略,如int iMx3=1,2,3,2,5,6;/正确int iMx2=1,2,3,2,5,6;/错误5. 数组与指针5.1
11、. 字符数组,字符串字符串是最后一个元素值为0的字符数组。char szText16=h,e,l,l,o,0;char szText2=h,e,l,l,o,0;char szText36=hello;char szText4=hello;char szText5=hello;char *pszText6=hello; /注意与 char szText5=hello;的区别char szNames8=“li”,”zhang”,”wang”;char *pszNames=“li”,”zhang”,”wang”;练习char szTitle=”I love this game”;char ch2dA
12、rray92;char ch2dArray236;/1、将szTitle中的字符依次填入ch2dArray数组中(按ch2dArray00,ch2dArray01,的顺序),不够的用0填充。2、把ch2dArray的元素依次赋给ch2dArray36;5.2. 数组与指针数组名代表数组中的第一个元素的地址,可以将该地址赋值给同数据类型的指针,指针赋值以后,可以按照数组名的方式使用,也可 以按照原有指针的方式进行访问。char szText=hello;char *pszTemp;pszTemp=szText;coutby array:szText1endl;coutby pointer arr
13、ay:pszTemp1endl;coutby pointer:*(pszTemp+1)endl;5.3. 数组与指针示例/ PointerAndArray.cpp : Defines the entry point for the console application./#include stdafx.h#include #include using namespace std;int main(int argc, char* argv)int i,j;/*可以将0赋值给指针,表示为空指针,但是不许用其他整数给指针赋值*/void *p=0; /或p=NULL;/void *p=2; 错误/
14、*将数组地址赋值给指针时,用数组名和数组名取地址效果是一样的。*/int iArray=1,2,3;p=iArray;p=&iArray;/*指针变量存储内存单元的地址,通过指针变量对内存地址的访问必须先知道指针变量的类型。比如用字符指针访问整型变量的各部分的指*/int i1=123;char *pCh1=(char *)(&i1);*(pCh1+1)=3;/*二维的整型数组,表示有2行、3列。在内存中是按顺序线性排列,所以等效地当作2*3个元素的一维数组。*/int i2dArray23=1,2,3,4,5,6;/*同样是2维的整型数组,如果在定义的时候赋值,行下标可以由编译系统自动计算出
15、来,如果定义的时候没赋初值,则行下标不能省略。*/int i2dArray23=1,2,3,4,5,6;/*数组之间不允许直接赋值,可以通过内存块拷贝或单个元素循环赋值的方式拷贝数组中的值*/int i2dArray323;/i2dArray3=i2dArray; /错误/*可以通过强制类型转换,用指针访问二维数组。sizeof操作符计算出来的是整个数组的大小。*/int *pi1;pi1=(int *)i2dArray;coutn=用线性的方式访问整数=endl;for(i=0; isizeof(i2dArray)/sizeof(int); i+) coutpi1i ;/*下面声明的是一个数
16、组,该数组有2个元素,每个元素是一个整型的指针*/int *piArray2;for(i=0; i2; i+) piArrayi=i2dArrayi;coutendl;coutn=用指针数组的方式访问整数=endl;for(i=0; i2; i+) for(j=0; j3; j+) cout*(piArrayi+j) ; /或cout*(*(piArray+i)+j) ; coutendl;/*下面声明的是一个指向整型指针的指针变量,该指针的值是(整型变量指针的地址)。*/int *ppi;ppi=&(piArray0);coutn=用指针的指针方式访问整数=endl;for(i=0; i2;
17、 i+) for(j=0; j3; j+) cout*(*(ppi+i)+j) ; /或cout*(*(piArray+i)+j) ; coutendl;/*下面声明的是一个指针变量,该指针指向的变量是具有3个元素的数组变量。*/int (*piArray2)3;piArray2=&iArray; /将一个一维数组变量的地址赋给piArray2piArray2=&(i2dArray0); /将一个二维数组的的第一个一维数组变量的制止赋值给piArray2/或piArray2=i2dArray;coutn=用数组指针的方式访问整数=endl;for(i=0; i2; i+) for(j=0; j
18、3; j+) cout(*(piArray+i)j ; coutendl;/*下面表示有3行3列字符的二维字符数组或者有3个元素的字符串数组。*/char szArray33=aa,bb,cc;char szArray23=aa,bb,cc;coutn=用2维数组的方式访问字符串=endl;for(i=0; i3; i+) coutszArrayi ;coutendl;/*下面表示一个指针数组,该数组存放的是字符数组的指针或者说是字符串的指针。(分析与szArray33内存布局的差异。以及pszArray和pszArray2的差异)*/char *pszArray=aa,bb,cc;char
19、*pszArray2=aa,bbbbb,cc;coutn=用指针数组的方式访问字符串=endl;for(i=0; i3; i+) cout*(pszArray2+i) ;coutendl;/*下面表示一个指针,该指针指向的是字符数组变量,字符数组的大小为3个字节(注意访问方式与指针数组相同)*/char (*pszArray3)3;pszArray3=szArray;coutn=用数组指针的方式访问字符串=endl;for(i=0; i3; i+) cout*(pszArray3+i) ;coutendl;/*下面表示一个指向字符指针的指针变量,或者说是指向字符串的指针(注意访问方式与上面两种仍然相同)*/char *ppsz;ppsz=pszArray;coutn=用指针的指针的方式访问字符串=endl;for(i=0; i3; i+) cout*(ppsz+i) ;coutendl;/*最后查看各种变量本身的大小,并自己手工测试对不同的变量怎么赋值进去。*/return 0;
限制150内