c数组和指针的理解
1 #include<stdio.h> 2 3 int main(void) 4 { 5 int a[]={1,2,3,4,5}; 6 int *p = (int*)(&a + 1); 7 printf("%d,%d\n",*a+1,*(p-1)); 8 9 // int (*ptr1)[5] = &a; √ 10 // int (*ptr2)[5] = a; × 11 // int (*ptr1)[3] = &a; × 12 // int (*ptr2)[3] = a; × 13 } 14 15 //2,5
数组名只可以作为右值!
当我们定义一个数组时候,编译器根据指定的元素个数和类型确定分配内存大小。并把这一块地址的名称赋为数组名称。
a[0]、a[1]......为数组元素,但并非元素名称!
指针,32系统总是为4字节(0x11111111)只能存放一个地址单元的值,所以总是存放的首地址。
但是访问时候需要根据类型大小来移动指针。
数组名:值等同于数组“首元素”的“首地址”(数组首元素的指针)
P + 1
char*移动一个字节,int*移动4个字节!数组指针移动一个数组元素类型长度!二级指针移动一个指针长度(4)!
&a:表示数组指针(取数组变量a的指针)
对数组的访问,总是转换为对指针的访问!
二维数组
1 int b[2][2] = {{1,2},{3,4}}; 2 // int *p2 = b; × 3 // int (*p5)[2] = b; √ 4 // int **p = b; ×
二维数组名称,指向首元素b[0]的指针,为数组指针【一级指针】!
1 // int *p3 = b[0]; √ 2 // int (*p4)[2][2] = &b; √
二维数组所有元素的访问(一级指针):
1 #include<stdio.h> 2 int main() 3 { 4 int iArray[2][3] = {{1,2,3},{4,5,6}}; 5 int *pArray = NULL; 6 7 pArray = (int*)iArray; 8 9 10 printf("array[0][0] = %d\n", *pArray); 11 printf("array[1][2] = %d\n", *(pArray + 5)); 12 printf("array[1][2] = %d\n", *(pArray + 1 * 3 + 2)); /*数组本身在地址空间中就是连续排列的*/ 13 printf("array[1][2] = %d\n", *((int *)(*((int (*)[3])pArray + 1)) + 2)); 14 return 0; 15 }
二维数组所有元素的访问(数组指针):
1 #include<stdio.h> 2 3 int main() 4 { 5 int iArray[2][3] = {{1,2,3},{4,5,6}}; 6 int (*pArray)[3] = NULL; 7 8 pArray = iArray; 9 10 printf("array[0][0] = %d\n", **pArray); 11 printf("array[1][2] = %d\n", *(*(pArray+1)+2)); 12 return 0; 13 }
1 int main() 2 { 3 int iArray[2][3] = {{1,2,3},{4,5,6}}; 4 5 int (*pArray)[3] = NULL; 6 7 pArray = iArray; 8 9 printf("array[0][0] = %d\n", pArray[0][0]); 10 printf("array[1][2] = %d\n", pArray[1][2]); 11 return 0; 12 }
二级指针
为指向指针的指针,指向的值必须是指针。
1 int main() 2 { 3 int iArray[2][3] = {{1,2,3},{4,5,6}}; 4 int *ipArray[2] = {iArray[0], iArray[1]}; 5 int **pArray = NULL; 6 7 pArray = ipArray; 8 9 printf("array[0][0] = %d\n", pArray[0][0]); 10 printf("array[1][2] = %d\n", pArray[1][2]); 11 12 return 0; 13 }