C语言中关于二维数据指针的问题?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言中关于二维数据指针的问题?相关的知识,希望对你有一定的参考价值。

uchar i;
uchar a[][4]="PASS","FAIL","NONE";
uchar b[][5]="10000","20000","30000";
uchar (*ip)[4];
二维数组指针变量ip可不可以不指定列大小?或者列大小是一个变量
写成这样行吗: uchar (*ip)[];
写成这样行吗: uchar (*ip)[i];
其实我想问的最终问题是定义一个二维数组指针变量,这个指针可不可以时而指向二维数组a,时而又指向二维数组b。也就是动态的二维数姐指针如何实现。

由于类型不同,要用到显式类型转换。
不过首先,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要定义多大的数组)- -。
----
[原创回答团]

参考资料:原创

参考技术A uchar a[][4]="PASS","FAIL","NONE";
uchar b[][5]="10000","20000","30000";
这种初始化有问题吧!
二维数组指针变量ip不可以不指定列大小。
如果两个二维数组的列数是一样的就可以时而指向二维数组a,时而又指向二维数组b。但若不是则不行。
参考技术B 其实没有二维数组指针变量这个用法之说 你说的有点问题
我想你是想 让一个指针变量可以改变它所指向的二维数组是吧
你用(*ip)[] 这种方式指定后 再指向其他二维数组会出错
但你可以不用这种方式
你可以 例如
int a[5][5],b[3][3];
int *p;
p=a[0];
p=b[0];
这种也是一种方式 就可以到达你要的效果了

关于c语言二维数组列指针初始化

关于c语言二维数组列指针初始化下图关于那个列指针的初始化有不懂。p=a[0],p=*a,p=&a[0][0]。书上说这三者等价,但是我有点不懂。
1.按照指针初始化的定义,int *p=&a[0][0];这一点,完全没问题,就算传了二维数组的首地址给指针。
2.但是,p=*a怎么会和上面等价呢 我记得*a不是去这个数组的第一个值吗,怎么能用值传给一个指针,或者说一个指针指向一个值。
3.p=a[0],这个不是传的是第一行的地址吗,和第三个具体的首地址能等价?
恳求各位前辈学长能够解惑(。ò ∀ ó。)感激~

参考技术A 你可以把二维数组a看成一个一维的指针数组,*a与a[0]等价,这样是不是好理解了?本回答被提问者和网友采纳 参考技术B Hubby and

以上是关于C语言中关于二维数据指针的问题?的主要内容,如果未能解决你的问题,请参考以下文章

关于c语言二维数组列指针初始化

C语言指针学习总结

c语言中怎样实现对二维数组元素进行赋值并输出。

C语言中怎样区分一维指针和二维指针?

c语言关于打印指针所指的值的问题

c语言中如何通过二级指针来操作二维数组