关于数组指针:
1 对于二维数组,初始化时,必须指定一个参数: int a [][3] ={{1,2,3},{1,2,3},{1,2,3}}, int a[][] ={} 这样是不允许的,因为要确定指针移动一步要走多远。 对于一位数组int a[] = {},这样可以。也就数说只有一个参数位置可以不用设置参数。
2 int (*p)[3] 必须加上小括号,这代表一个指向数组的指针,数字3,代表每一列有三个数。这样就定义了一个,二位数组。
p[0]代表第一行的第一个数的地址,p[1]代表第二行的第一个数的地址,p[2]代表第三行的第一个数的地址,注意与一位数组的
区别,对于一位数组p[0]代表第一个数字的实际值,而不是地址,但是对于二维数组p[0]代表的却是一个地址,要想得到这个地址的值
还要加上*号,如:*(p[0]),这代表第一行的第一个数字的实际值,也可以这样表达: a[0][0],这种表达方式就与一维数组的表达方式一样了。a[0][0] 就相当于 *(*(a+0)+0) , 相当于 *(a+0)[0], 相当于*(a[0]+0), 全都是在表达二位数组的第一行的第一个数的实际值,而不是地址值。
总结: 二位数组的指针的使用方式依旧是从一位数组的指针的使用方式来的,即:在一维数组中a[0]=*(a+0),
在二维数组中a[0]已经不再表示实际值了,而是表示地址值,但是a[0][0]=*(*(a+0)+0), 依旧表示的是实际值而不是地址,这还是相当于一维数组。
#include<stdio.h> int main() { int a[][2]={{1,2},{3,4}}; printf("1这是第一行第一个元素的值:%d ",a[0][0]); printf("2这是第一行第一个元素的值:%d ",*(*(a+0)+0)); printf("3这是第一行第一个元素的值:%d ",(*(a+0))[0]); printf("4这是第一行第一个元素的值:%d ",*(a[0]+0)); printf("------------- "); printf("这是第一行第一个元素的地址:%d ",a[0]); printf("这是第一行第一个元素的数值:%d ",*(a[0])); return 0; }
关于指针的数组:
int * a[2] 代表着指针的数组, 2 代表着 指针每走一步,向前走多远。
int b[][2]={{1,2},{1,2}}
a[0] = b[0] 存放着二维数组b 的第0行的第0个元素的地址,注意b[0] 代表的是地址,而不是实际值
a[1] = b[1] 存放着二维数组b第一行的第一个元素的地址,注意b[1]代表的是地址,而不是实际值。
#include<stdio.h> int main() { int *a[2]; int b[][2] = {{1,2},{3,4}}; a[0] = b[0]; //第一个行第一个元素的地址 a[1] = b[1]; //第二行第一个元素的地址 printf("%d ",a[0]); //打印地址值 printf("%d ",a[1]); printf("%d ",*(a[0])); //打印实际值 printf("%d ",*(a[1])); return 0; } // conclusion 关于指针的数组 int a[2],必须指明有几个元素,不同于一位数组。