本帖最后由 chunhuayun 于 2015-9-27 22:34 编辑
一、用数组名访问二维数组 如下图
例如: - int a[][3] = {1,2,3,4,5,6};
-
- printf("sizeof(a) = %ld\n", sizeof(a));
- printf("sizeof(a[0]) = %ld\n", sizeof(a[0]));
-
- printf("a = %p\n", a);
- printf("a[0] = %p\n", a[0]);
-
-
-
- printf("a[0] + 1 = %p\n", a[0] + 1);
- printf("a + 1 = %p\n", a + 1);
- printf("a[1][0] = %p", &a[1][0]);
复制代码
打印结果: sizeof(a) = 24 sizeof(a[0]) = 12 a = 0x7fff5fbff8f0 a[0] = 0x7fff5fbff8f0 a[0] + 1 = 0x7fff5fbff8f4 a + 1 = 0x7fff5fbff8fc a[1][0] = 0x7fff5fbff8fc
结论: 由打印结果可知,虽然a的地址和a[0]的地址是一样的,但是由于sizeof(a) 和sizeof(a[0])不一样,所以a+1和a[0]+1的结果是不一样的。a+ 1表示的是第2行的第一个元素,a[0] + 1表示的是第一行的第二个元素
例2: - int a[][3] = {1,2,3,4,5,6};
-
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 3; j++) {
- printf("%d ", *(a[i] + j));
- //printf("%d ", *(*(a + i) + j));//同上
- }
- printf("\n");
- }
复制代码
打印结果: 1 2 3 4 5 6
二、用普通指针访问数组 这样做本身是不对的,因为,假设定义了一个数组
Int a[][3] = {1,2,3,4,5,6};用一个int *p = a;来访问数组a。指针应该指向相同类型的变量, 而此处int类型的指针指向了int[][]类型的数组变量。虽然这样做不会报错,但是一般不可取
三、二维数组指针的定义、初始化
1.二维数组指针变量的定义 1.1 一般形式: 数据类型 (*指针变量名) [二维数组列数]; 1.2如果要讲二维数组赋给一个指针,应该这样 - Int a[2][3];
- Int (*p)[4]; //该语句是定义一个数组指针,指向含4个元素的一维数组
- P = a; // 将该二维数组的首地址赋给p, 也就是a[0]或是&a[0][0]
- P++; //该语句执行过后,也就是p = p + 1,p跨国行a[0]指向了行a[1]
复制代码
所以数组指针也称为 【指向一维数组的指针】,也称为【行指针】 二维数组指针可以替代数组名去使用 1.3 用法如下 - int a[][3] = {1,2,3,4,5,6};
- int (*p)[3] = a;
- for (int i = 0; i < 2; i++) {
- for (int j = 0; j < 3; j++) {
- printf("%d ", *(*p + j));
- }
- p++;
- printf("\n");
- }
复制代码
打印结果: 1 2 3 4 5 6 1.4指针数组和二维数组指针变量的区别 - int *p2[2] = {&a[0][0], &a[1][0]};//p2是一个指针数组
复制代码
区别:二维数组指针是单个变量,其一般形式是“(*变量名)”两边的括号不可少,而指针数组类型表示的是多个指针(一组有序指针)在一般形式“*指针数组名”两边不能有括号,例如: Int (*p)[3]表示的是一个指向二维数组的指针变量,该二维数组的列数位3或分解为一位数组的长度位3.而int *p[3]表示的是一个指针数组,表示的3个有序指针。
|