user-0 提问: 有关数组指针的问题

回复:
user: user-1
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 (*(*x[3])())[5];//是个数组，大小为3     char (*(*x0  )())[5];//数组的元素，是个函数指针     char (*( x00 )())[5];//函数原型，参数为空，返回值为指针     char (*  x000   )[5];//返回值      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-2
content: 上面说错，是char aa[][3];  char bb[][3];

user: user-2
content: 引用 3 楼 u014069062 的回复:“指向一个char[3]的指针”这个是什么意思呢？  数组也是一种类型，一个指针也可以指向他啊  如果你定义了char aa[3];  char bb[3]; 那么你的指针可以指向aa，也可以指向bb 虽然是指向的是首地址，但和二级指针不完全一样，区别同intr[]与int*

user: user-0
content: 引用 4 楼 adan_shaw_VC 的回复:首先，你定义的字符串是没有结束 转义字符，所以会造成： abc...后面乱码 def...后面乱码 乱码   其次，char (*p)[3] = a; 一维字符指针只会指向单个字符。 char (*p)[3] = a; p[0] == a , p[1] == b , p[2] == 0 . 我测试了下，发现p[0]、p[1]并非是单个字符的值，而是指向的某个字符串……

user: user-0
content: [quote=引用 2 楼 paschen 的回复:] 指向一个char[3]的指针  这个可以理解为二维指针变量吗？

user: user-3
content: 首先，你定义的字符串是没有结束 转义字符，所以会造成： abc...后面乱码 def...后面乱码 乱码   其次，char (*p)[3] = a; 一维字符指针只会指向单个字符。 char (*p)[3] = a; p[0] == a , p[1] == b , p[2] == 0 .

user: user-0
content: “指向一个char[3]的指针”这个是什么意思呢？

user: user-2
content: 指向一个char[3]的指针  如果是char *p[3]  ，则是一个int*类型的数组，这个数组中有3个int*类型的元素

user: user-4
content: 指向一维数组的指针

user: user-5
content: 引用 4 楼 adan_shaw_VC 的回复:首先，你定义的字符串是没有结束 转义字符，所以会造成： abc...后面乱码 def...后面乱码 乱码   其次，char (*p)[3] = a; 一维字符指针只会指向单个字符。 char (*p)[3] = a; p[0] == a , p[1] == b , p[2] == 0 .楼主也没说是字符串  你想太多了 另外 你并不了解数组指针 还是先看书了解一下

user: user-6
content: 引用 10 楼 lm_whales 的回复:char a[][3] = {'a','b','c','d','e','f'}; char (*p)[3] = a;///<==> char (*p)[3] = &a[0]; a[0] 是个三个字符的数组 p++;/// p== &a[1]; p--;/// 重新变成 p ==&a[0]; char (*p)[3]  ；///指向定长数组的指针, 指向的数组 ,有3个char 元素. p[0][0]///<==>a[0][0]; p[1][1]///<==>a[1][1]; 数组的指针，和非数组指针用法其实是相同的，只是写法比较奇怪 数组指针，指向的目标是数组。 指针数组，每个元素都是指针。  数组指针，只需要 初始化或者赋值一次。就可以像二维数组一样，使用两个下标。 指针数组，每个指针元素，都需要初始化或者赋值一次，才可以像二维数组一样，使用两个下标。 修改一下

user: user-6
content: char a[][3] = {'a','b','c','d','e','f'}; char (*p)[3] = a;///<==> char (*p)[3] = &a[0]; a[0] 是个三个字符的数组 p++;/// p== &a[1]; p--;///  p ==&a[1]; char (*p)[3]  ；///指向定长数组的指针, 指向的数组 ,有3个char 元素. p[0][0]///<==>a[0][0]; p[1][1]///<==>a[1][1]; 数组的指针，和非数组指针用法其实是相同的，只是写法比较奇怪 数组指针，指向的目标是数组。 指针数组，每个元素都是指针。  数组指针，只需要 初始化或者赋值一次。就可以像二维数组一样，使用两个下标。 指针数组，每个指针元素，都需要初始化或者赋值一次，才可以像二维数组一样，使用两个下标。

user: user-7
content: 举例： int a[5][10]={1,2}; int (*p)[10]=a; cout<<p<<endl; cout<<p[0]<<endl; cout<<p[9]<<endl;  p是指向二维数组a的指针，请问p[0],p[9]分别是什么？ 解答： int(*p)[10]定义了一个指向二维数组的指针p，赋给它10个长度。然后把a数组的值赋给(*p)[10]，注意，这里是a数组是5行10列的，放入（*p）[10]是把a[0][0]，a[0][1]，a[0][2]，a[0][3]，a[0][4]，a[0][5]，a[0][6]，a[0][7]，a[0][8]，a[0][9]放入(*p)[0]中，同理，将a[1][0...9]放入(*p)[1]。最后（*p）[10]中的值只有五行被初始化为a数组的值了。 在本例中，p和p[0]是同一个意思，就是数组a的起始地址，等价于cout<<a<<endl，但是他们有区别，p指向的是整个数组的首地址，而p[0]则指向a的首行首地址（继续往下看...）。 p[9]则值内存为p数组分配的(*p)[9]的地址。如果你仔细验证程序的输出结果，你就会发现： #include<stdio.h> #include "iostream" using std::cout; using std::endl; using std::hex; void main() { int a[5][10]={1,2}; int (*p)[10]=a; cout<<p<<endl; cout<<p[0]<<endl; cout<<p[9]<<endl; } 输出结果为(不同机器结果不同)： 0012FEB8 0012FEB8 00130020 如果你验证它们这些地址存储的值，你会发现： #include<stdio.h> #include "iostream" using std::cout; using std::endl; using std::hex; void main() { int a[5][10]={1,2}; int (*p)[10]=a; cout<<*p<<endl; cout<<(*p)[0]<<endl; cout<<(*p)[9]<<endl; } 输出结果为： 0012FEB8 1 0 这是p和p[0]的区别就体现出来了。因为*p并不是取首元素的值，它这时才相当于p[0]。那如何通过p取得首元素的值呢，很显然，应该再加一个*操作符，如下： cout<<**p<<endl; 这时输出结果自然就会和(*p)[0]一样是1了。