C++的数组和指针

来源:互联网 发布:python random.choice 编辑:程序博客网 时间:2024/04/30 12:26

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

 二级指针创建二维数组


0 0
原创粉丝点击