C++的指针使用很灵活,尤其是在和数组配合使用时。
1. 数组元素在内存中是连续存放的,如char a[10]; 在内存是按照a[0]、a[1]、a[2]、...、a[9]顺序存放。数组名a代表了这个一维数组的起始地址,是个常量。
char *p=a; 在程序中p[i]和a[i]是等价的,p和a不同的是,p是指针变量,可以变。a是常量,不能变。a和&a[0]是等价的。
在函数的形参中,比如:void fun(char str[10]); 这个形参数组长度指定是没有作用的,等价于void fun(char str[ ]); 也等价于void fun(char *str);
2.数组在使用时,要注意下标不要越界。如上面a数组元素下标是0到9。如果a[10]=12; 会有不可预料的错误。
a[i]等价于*(a+i)。一维数组通过下标也可以变化为二维数组使用,如:
char a[100];
int i,j;
for(i=0;i<20;i++)
{
for(j=0;j<5;j++)
{
a[i*5+j]=8;
}
}
3.二维数组int a[3][4]; a、a[0]、&a[0][0]都是同一地址,但意义不同。a是二维数组名,是常量,是第1个元素的地址,是行指向,a+1指向第2行第1个元素,是按行移动。
a[0]和&a[0][0]是等价的,都是列指向。a[0]+1是按列移动。
a[i][j]等价于*(*(a+i)+j)
int (*p)[4]=a; 这里p是一个指向一行有4个int型元素的指针变量,p[i][j]和a[i][j]等价。
注意:*的级别低于[ ],*(p+2)[2]是错误的,相当于*((p+2)[2]),即*(*(p+2+2)),p[4][0],下标出界。改为:(*(p+2))[2]可以,相当于p[2][2]
int *p[4]; 定义了一个含有4个元素的指针数组p。
练习:
double t[3][3],(*pt)[3]=t则对t数组元素错误的引用是:(答案是A)
A) *(pt+1)[2] B) *(pt[0]+1) C) t[0][2] D) (*(t))[2]
已知:int a[3][4],*p=a[0];p+=7; ,那么与*p的值相同的是:(答案是B)
A) *(a+7) B) *(&a[0][0]+7) C) *(a[0]+3) D) *(&a[1][1]+7)
4. 二维数组int a[3][4]; 也可以理解为a是一个一维指针数组,有3个元素a[0]、a[1]、a[2],这三个元素都是指针,每个指针又是一个一维数组。a[0]数组有4个元素a[0][0]、a[0][1]、a[0][2]、a[0][3]。
下面这个练习可以很好地理解数组和指针的使用:
http://blog.csdn.net/qq_27183003/article/details/49699463