user-0 提问: 二维数组，数组名？

回复:
user: user-1
content: 数组的问题是最难的

user: user-2
content: 引用 12 楼 Daffodiles 的回复:2.  for(int (*p)[3]=a; p<a+2; p++)   数组名：a，是个指针。 变量：(*p)[3]，也是个指针。  3.  for(int *q=*p; q<*p+3; q++)  变量：*p 取指针所指向对象的值。不过，它的值，还是个指针而已。引用 12 楼 Daffodiles 的回复:2.  for(int (*p)[3]=a; p<a+2; p++)   数组名：a，是个指针。 变量：(*p)[3]，也是个指针。  3.  for(int *q=*p; q<*p+3; q++)  变量：*p 取指针所指向对象的值。不过，它的值，还是个指针而已。错了  你对数组的了解太贫瘠 不懂数组也是一种数据类型  不懂数组和指针之间的类型转换

user: user-2
content: 引用 16 楼 Daffodiles 的回复:知道我所说的东西对你来说太难了  毕竟你水平就这样 1年前在问一级数组一级指针  1年了 终于问二级数组了 难得难得  你是我见过学习C语言 速度最最慢的人 没有之一 而且也是 学得最差的了 白瞎了一把入门书  学得和谭C一样 你是不是看过谭C了?

user: user-3
content: *p是指针，p是二级指针

user: user-3
content: 你说的都是对的 #include<stdio.h> #include<stdlib.h>  int main() { 		int a[2][3]= {{1,2,3}, 				    	{4,5,6}}; 		for(int (*p)[3] = a; p < a + 2; ++p) 				for(int *q=*p; q < *p + 3; ++q) 						printf("%d\t",*q);  		exit(0); }

user: user-0
content: 程序是用指针遍历数组元素。

user: user-4
content: 仅供参考#include <stdio.h> #include <stdlib.h> #include <malloc.h> int **newarr2d(int rows,int cols) {     int **p,i;      p=(int **)malloc(rows*sizeof(int *));     if (NULL==p) exit(1);     for (i=0;i<rows;i++) {         p[i]=(int *)malloc(cols*sizeof(int));         if (NULL==p[i]) exit(1);     }     return p; } void deletearr2d(int **p,int rows) {     int i;      for (i=0;i<rows;i++) {         free(p[i]);     }     free(p); } int main() {     int **arr2d,i,j,r,c;      r=4;     c=5;     //在堆中开辟一个4×5的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      r=6;     c=3;     //在堆中开辟一个6×3的二维int数组     arr2d=newarr2d(r,c);     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             arr2d[i][j]=i*c+j;         }     }     for (i=0;i<r;i++) {         for (j=0;j<c;j++) {             printf(" %2d",arr2d[i][j]);         }         printf("\n");     }     deletearr2d(arr2d,r);      return 0; } //  0  1  2  3  4 //  5  6  7  8  9 // 10 11 12 13 14 // 15 16 17 18 19 //  0  1  2 //  3  4  5 //  6  7  8 //  9 10 11 // 12 13 14 // 15 16 17 //

user: user-0
content: 2.  for(int (*p)[3]=a; p<a+2; p++)   数组名：a，是个指针。 变量：(*p)[3]，也是个指针。  3.  for(int *q=*p; q<*p+3; q++)  变量：*p 取指针所指向对象的值。不过，它的值，还是个指针而已。

user: user-5
content: 引用 10 楼 williamhong 的回复:[quote=引用 6 楼 lin5161678 的回复:] [quote=引用 5 楼 user-7 的回复:] 2.使用数组名时，实际上将其自动转换为指向该数组第一个元素的指针。 自动转换 只在特定情况下会发生 不是使用数组名就会发生转换 引用a的类型就是int (*)［3］ a的数据类型就是int[2][3] 而不是 int(*)[3][/quote]  例子中没有自动转换 a的数据类型虽然不是 int(*)[3]，但也不是int[2][3]，因为int[2][3]不是c语言的有效类型，明白意思，但好像写不出来这种类型（也许能写出来可能我不知道） [/quote] 刚才说错了，a的类型是int[2][3]，写法也是int[2][3]

user: user-5
content: 引用 6 楼 lin5161678 的回复:[quote=引用 5 楼 user-7 的回复:] 2.使用数组名时，实际上将其自动转换为指向该数组第一个元素的指针。 自动转换 只在特定情况下会发生 不是使用数组名就会发生转换 引用a的类型就是int (*)［3］ a的数据类型就是int[2][3] 而不是 int(*)[3][/quote]  例子中没有自动转换 a的数据类型虽然不是 int(*)[3]，但也不是int[2][3]，因为int[2][3]不是c语言的有效类型，明白意思，但好像写不出来这种类型（也许能写出来可能我不知道）

user: user-6
content: 谢楼上指点  #include <stdio.h>  int main(){   char * pc;    printf("sizeof pc :%d\n",sizeof(pc));   // 指针的大小 在我这里是 8     int a[2][3]={{1,2,3}, 	       {4,5,6}};         printf("sizeof a :%d   pointer a :%p   pointer of a+1 %p \n",sizeof(a),a,a+1);   printf("sizeof a[1] :%d\n",sizeof(a[1]));    int aa[3][2]={{1,2}, 		{3,4}, 		{5,6}};      printf("sizeof aa :%d   pointer aa :%p   pointer of aa+1 %p \n",sizeof(aa),aa,aa+1);   printf("sizeof aa[1] :%d\n",sizeof(aa[1]));    int ** ppa = a ;      printf("sizeof ppa :%d   pointer ppa :%p   pointer of ppa+1 %p \n",sizeof(ppa),ppa,ppa+1);   printf("sizeof ppa[1] :%d\n",sizeof(ppa[1]));   printf("sizeof **ppa :%d\n",sizeof(**ppa));     char c[] = "ABCD";   char ** ppc = &c ;      printf("sizeof ppc :%d   pointer ppc :%p   pointer of ppc + 1 %p \n",sizeof(ppc),ppc,ppc+1);   printf("sizeof ppc[1] :%d\n",sizeof(ppc[1]));   printf("sizeof **ppc :%d\n",sizeof(**ppc));         for(int (*p)[3]=a; p<a+2; p++){      printf("sizeof p :%d\n",sizeof(p));        printf("sizeof *p :%d\n",sizeof(*p));        for(int *q=*p; q<*p+3; q++){       printf("%d ",*q);     }   } }

user: user-4
content: 仅供参考//char (*(*x[3])())[5];//x是什么类型的变量? // //分析C语言声明，关键是搞清楚这个变量是个什么东西（函数、指针、数组）， //是函数那么剩下的就是他的参数和返回值， //是指针那剩下部分是说明他指向什么， //是数组剩下的部分就是说明数组的成员是什么类型。 //解析C语言声明规则： //从左侧第一个标识符开始，按照优先级进行结合。*表示是..的指针，const表示只读的，volatile表示可变的，[]表示是数组，()表示是函数。 // //x和[3]结合说明是一个大小为3的数组，该数组的每个元素为一类指针，该类指针指向一类函数，该类函数无参数，返回一类指针，该类指针指向一个大小为5的char型数组 #include <stdio.h> #include <typeinfo.h> char num[5]; char (*x00())[5] {     return # } int main() {     char (*x000)[5];//返回值     char (*(x00)())[5];//函数原型，参数为空，返回值为指针     char (*(*x0)())[5];//数组的元素，是个函数指针     char (*(*x[3])())[5];//是个数组，大小为3      x0 = x00;     x[0] = x0;     x[1] = x0;     x[2] = x0;     printf("typeid(x).name() is %s\n",typeid(x).name());     return 0; } //typeid(x).name() is char (* (__cdecl**)(void))[5]

user: user-6
content: 这个可以用几行代码测试的吧  还是让代码自己说吧！  只需要几个 sizeof  ++  printf 就足够了  晚上有时间测一下

user: user-2
content: 引用 5 楼 user-7 的回复:2.使用数组名时，实际上将其自动转换为指向该数组第一个元素的指针。 自动转换 只在特定情况下会发生 不是使用数组名就会发生转换 引用a的类型就是int (*)［3］ a的数据类型就是int[2][3] 而不是 int(*)[3]

user: user-7
content: 对于数组，有两个基本概念要清楚： 1.严格地说，C/C++里并没有多维数组，通常所指的多维数组其实就是数组的数组。 2.使用数组名时，实际上将其自动转换为指向该数组第一个元素的指针。  所以，a是一个有两个元素的数组，每个元素又是一个有三个元素的数组。根据上面可知，a也是一个指向有三个整型元素的数组的指针，那么，a的类型就是int (*)［3］，因为［］的优先级比*高，所以声明p的时候要用括号，否则p就变成数组了。  既然p是一个指向int ［3］数组的指针，那么对指针p解引用的*p当然是一个int ［3］的数组。 既然*p是一个数组，那么它同样也是一个指向数组首元素的指针，也就是一个int *。

user: user-2
content: 问题： 1.这个程序，对么？ 单纯讨论语法的话 程序是对的   2.数组名：a，是指针的指针么？ a是数组不是指针 更不是指针的指针   (*p)[3]：也是指针的指针么？ 这个是数组的指针 不是指针的指针  3. C/C++ code  ? 1 for(int *q=*p; q<*p+3; q++)  变量：*p 是个指针，而非指针的指针。对么？ 对