A. C语言中如何用指针运算符来表示一个二维数组的元素及地址
二维指针,就是说第一维是指针,第二维还是指针;
拿*(*(a+i)+j)来说:a是数组的首地址吧,然后+i,就是说a地址向后偏移i位。就是a+i的地址了,注意,这里a+i只是地址,用*符号取出该地址的数据,就是*(a+i),这里*(a+i)就是第一维指针,它指的是地址,不是数据。
而且后面的*(a+i)+j就是说以*(a+i)为首地址,偏移j位,然后使用*取内容,这里就是第二维了,取到的数据就是实际数据了
B. C语言中关于二维数据指针的问题
由于类型不同,要用到显式类型转换。
不过首先,LZ定义的初始化列表明显有问题。
可用代码示例:
typedef char uchar;/*无论是C还是C++,char、signed char和unsigned char三者都无法保证为完全相同的类型(取决于平台和编译环境),为了类型兼容起见先这样定义。*/
uchar i;
uchar a[][5]={"PASS","FAIL","NONE"};/*注意char字符串(字面量)所占空间等于它本身+1,因为还有结束符'\0'。*/
uchar b[][6]={"10000","20000","30000"};/*同上。*/
uchar (*ip)[4];
ip = (uchar(*)[4])a;
ip = (uchar(*)[4])b;
另外可以用通用类型指针void*,在使用之前再显式转换类型(好处是这样的指针可以存放各种类型的地址,只要清楚引用时应该转化类型就行了)。
C/C++中数组一旦定义,便无法改变大小。除了支持C99标准的编译器外,定义数组时下标无法指定为变量。如果要实现动态数组,也不能使用这种方法,可以用指针+内存分配函数。总之,LZ的问题已在上面解决,用这方法……死心罢(编译器根本没法确定LZ要定义多大的数组)- -。
----
[原创回答团]