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
",*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
", *pArray);
11     printf("array[1][2] = %d
", *(pArray + 5));
12     printf("array[1][2] = %d
", *(pArray + 1 * 3 + 2));      /*数组本身在地址空间中就是连续排列的*/
13     printf("array[1][2] = %d
", *((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
", **pArray);
11     printf("array[1][2] = %d
", *(*(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
", pArray[0][0]);
10         printf("array[1][2] = %d
", 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
", pArray[0][0]);
10         printf("array[1][2] = %d
", pArray[1][2]);
11      
12         return 0;
13 }
原文地址:https://www.cnblogs.com/licongyu/p/5026542.html