您的位置:首页 > 编程语言 > C语言/C++

c++primer笔记之数组与指针的一些总结

2017-01-19 15:47 288 查看

数组的定义方式:

类型 数组名[维度];

eg: int a[10] , int b[10][10][10];

 //注意: 

 1.数组的维度也是数组类型的一部分。

    eg: int a[10];  数组a的类型为int[10];

       int b[10][10][10] 数组b的类型为int[10][10][10];

 2.维度必须是编译期常量!!!

 3.数组不可以拷贝和赋值。 ==》  这个决定了函数的返回值类型不可以是数组。

    eg:int a = {0,1,2};   int b[] = a;  //错误

复杂的数组的声明:

int *ptrs[10] ;        ==>> ptrs类型为数组,数组的元素类型是int *(即指向整形的指针)。
int &refs[10] ;        ==>> 错误,不存在元素为引用的数组。
int (*pArray)[10] ;    ==>> PArray类型为指针,指向的对象的类型为int [10](即维度为10的数组)。

Note:
1.在大多数的表达式中,使用数组类型的对象其实是使用一个指向该数组首元素的指针。
2.严格来说,c++语言中并没有多维数组,通常所说的多维数组其实就是数组的数组。


    eg: int arr[10][10][10];    arr是个大小为10的数组,它的每个元素都是大小为10的数组,这些数组的元素又都是含有10个整形的数组。

下标和指针:
    参考Note1,,在很多情况下使用数组的名字其实用的是一个指向数组首元素的指针,一个典型的例子就是当对数组使用下标运算时,编译期会自动执行上述转换。
    eg:
int ia[] = {0,2,4,6};
int i= ia[2] ; //ia转换为指向数组首元素的指针,等价于: int *p = ia/*p指向ia的首元素*/; i = *(p + 2);
int* p = &ia[2]; //p指向索引为2的元素.
int j = p[1]; //p[1]等价于*(p+1).
int k = p[-2]; //p[-2]是ia[0]的元素. //指针的下标运算所用的索引并不是无符号类型,这一点跟stl中的vector,string类型并不相同。

指针分析:

//一维数组
int   arr[10]       = {0};
int (*p00)[10]      = &arr;     //arr的类型为int[10],因此取地址后获取的指针类型为int[10] *。
int  *p01           = arr;      //arr为数组名,参考上面Note1,数组名通常转换为指向数组首元素的指针,首元素为int类型。

//二维数组
int   arr1[10][10]  = {0};
int (*p10)[10][10]  = &arr1;    //arr1类型为int[10][10],因此对arr1取地址后获取的指针类型为int[10][10] *。
int (*p11)[10]      = arr1;     //arr1为数组名,参考上面Note1,数组名通常转换为指向数组首元素的指针,首元素为int[10]类型。
int  *p12           = arr1[0];  //arr1[0]为arr1第一个元素,且arr1的元素是类型为int[10]的数组,因此arr1[0]也为数组名,参考上面Note1,数组名通常转换为指向数组首元素的指针,首元素为int类型。
int (*p13)[10]      = &arr1[0]; //arr1[0]为arr1第一个元素,且arr1的元素是类型为int[10]的数组,因此取地址后获取的指针类型为int[10] *。

//三维数组
int  arr2[10][10][10]  = {0};
int (*p20)[10][10][10] = &arr2; //arr2类型为int[10][10][10],因此对arr2取地址后获取的指针类型为int[10][10][10] *。
int (*p21)[10][10]     =  arr2; //arr2为数组名,参考上面Note1,数组名通常转换为指向数组首元素的指针,首元素为int[10][10]类型。
int (*p22)[10][10]     = &arr2[0];
int (*p23)[10]         =  arr2[0];
int (*p24)[10]         = &arr2[0][0];
int  *p25              =  arr2[0][0];
int  *p26              = &arr2[0][0][0];









                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: