1.一维数组
int array[5]={1,2,3,4,5};
int *ap = array + 2
array + 1
&array + 1
一维数组名的值是一个指针常量,它的类型是"指向元素类型的指针",它指向数组的第一个元素。
数组名+1,是+数组元素大小的字节数;数组名的地址+1,是+整个数组大小的字节数。
ap = array+2 = &array[2]
*ap = array[2] = *(array+2) = ap[0] = *(ap+(0)) = array[2]
ap+6 = array+8 = &arrY[8]
*ap+6 = array[2]+6
*(ap+6) = array[8] = ap[6]
ap[-1] = array[1]
C的下标引用和间接访问表达式是一样的。
int array[5]={1,2,3,4,5};
cout<<*(*(&array+1)-1);
会输出什么?
这道题答案是5。
解析:
*(*(&array+1)-1)里,
&array是取array的地址;
&array+1就是在array的地址的基础上向前跑4*5个字节;
*(&array+1)就是在数组末尾再往后一个字节的地址;
*(&array+1)-1就是数组末尾的地址;
*(*(&array+1)-1)就是数组末尾的那个元素。
2.多维数组
int a;
int b[10];
int c[6][10];
int d[3][6][10];
a是简单的整数。
b是一个向量,它包含10个整型元素。
c是一个包含6个元素的向量,只不过它的每个元素本身是一个包含10个整型元素的向量。c是个一维数组的一维数组。
d是一个包含3个元素的数组,每个元素都是包含6个元素的数组,而这6个元素中的每一个又都是包含10个整型元素的数组。
int matrix[3][10]
matrix:它的类型是“指向包含10个整型元素的数组的指针”,指向包含10个整型元素的第一个子数组。
matrix + 1:它是一个“指向包含10个整型元素的数组的指针”” ,但它指向matrix的另一行。
*(matrix + 1):它的类型是“指向整型的指针”,指向第二排的第一个元素
*(matrix + 1) + 5:它是一个指向整型值的指针,它指向的位置比上一个表达式指向的位置向后偏移5个整型元素。
*(*(matrix + 1) + 5):它是一个整型元素,相当于matrix[1][5]
int matrix[3][10]
int (*p)[10] = matrix
p是指向整型数组的指针,是一个指向拥有10个整型元素的数组的指针。
数组作为函数参数
#一维数组
int vector[10];
void func1(int *vec);
void func1(int vec[]);
#多维数组
int matrix[3][10]
void func2(int (*mat)[10]);
void func2(int mat[][10]);
3.指针数组(二重指针)
int *api[10];