e****d 发帖数: 333 | 1 工作中常用到二维数组,请问怎么处理,
直接定义 T[ ][ ] 和动态分配 T**,两者好像不一样,为什么呢?相互也不能转化。
为什么呢?函数也不能返回二维数组吗?
大侠们工作中用到二维数组都是怎么处理的呢?如果要大小可变的,好像就必须动态非
配,但是缺点就是很容易出错。
多谢。 |
t****t 发帖数: 6806 | 2 http://c-faq.com/aryptr/index.html
【在 e****d 的大作中提到】 : 工作中常用到二维数组,请问怎么处理, : 直接定义 T[ ][ ] 和动态分配 T**,两者好像不一样,为什么呢?相互也不能转化。 : 为什么呢?函数也不能返回二维数组吗? : 大侠们工作中用到二维数组都是怎么处理的呢?如果要大小可变的,好像就必须动态非 : 配,但是缺点就是很容易出错。 : 多谢。
|
h*********e 发帖数: 56 | 3 int 'int T[][]' and 'int **T' are very very different.
I think T[][] is easier to use as well as to allocate, because all you need
for T[m][n] is a matrix of m by n. And I guess the compiler actually treats
it as a one dimensional array. T is then a constant and contains the address
of the 1st element.
With **T, you need
1) m arrays (rows), each of which contains n elements (columns)
2) an array of m elements, each pointing to one of the m rows
3) a pointer to a pointer to T, pointing to the 1st |
a****l 发帖数: 8211 | 4 you should ask "T[][] vs T*", otherwise you are comparing apples to oranges.
【在 e****d 的大作中提到】 : 工作中常用到二维数组,请问怎么处理, : 直接定义 T[ ][ ] 和动态分配 T**,两者好像不一样,为什么呢?相互也不能转化。 : 为什么呢?函数也不能返回二维数组吗? : 大侠们工作中用到二维数组都是怎么处理的呢?如果要大小可变的,好像就必须动态非 : 配,但是缺点就是很容易出错。 : 多谢。
|
X****r 发帖数: 3557 | 5 Beginners often ask "T[][] vs T**" because they have similar syntaxes.
oranges.
【在 a****l 的大作中提到】 : you should ask "T[][] vs T*", otherwise you are comparing apples to oranges.
|
h*****0 发帖数: 4889 | 6 好像java里的T[][]和C里的T**是基本一样的。
【在 X****r 的大作中提到】 : Beginners often ask "T[][] vs T**" because they have similar syntaxes. : : oranges.
|
X****r 发帖数: 3557 | 7 就结构而言Java里非primitive类型类似于C里对应的指针类型,
所以如果T是primitive的话,Java里T类似于C里的T,
Java里T[]类似于C里的T(*)[],
Java里T[][]类似于C里的T(*(*)[])[];
如果T不是primitive的话,Java里T类似于C里的T*,
Java里T[]类似于C里的T*(*)[],
Java里T[][]类似于C里的T*(*(*)[])[]。
就语法而言Java里非primitive类型存取不需要加*。
【在 h*****0 的大作中提到】 : 好像java里的T[][]和C里的T**是基本一样的。
|
t****t 发帖数: 6806 | 8 你是在练习绕口令吗!
【在 X****r 的大作中提到】 : 就结构而言Java里非primitive类型类似于C里对应的指针类型, : 所以如果T是primitive的话,Java里T类似于C里的T, : Java里T[]类似于C里的T(*)[], : Java里T[][]类似于C里的T(*(*)[])[]; : 如果T不是primitive的话,Java里T类似于C里的T*, : Java里T[]类似于C里的T*(*)[], : Java里T[][]类似于C里的T*(*(*)[])[]。 : 就语法而言Java里非primitive类型存取不需要加*。
|
|
t****t 发帖数: 6806 | 9 我承认, 我没看懂T(*)[]是什么意思?
【在 X****r 的大作中提到】 : 就结构而言Java里非primitive类型类似于C里对应的指针类型, : 所以如果T是primitive的话,Java里T类似于C里的T, : Java里T[]类似于C里的T(*)[], : Java里T[][]类似于C里的T(*(*)[])[]; : 如果T不是primitive的话,Java里T类似于C里的T*, : Java里T[]类似于C里的T*(*)[], : Java里T[][]类似于C里的T*(*(*)[])[]。 : 就语法而言Java里非primitive类型存取不需要加*。
|
X****r 发帖数: 3557 | 10 指向每个成员类型为T的数组的指针?写得不对?
【在 t****t 的大作中提到】 : 我承认, 我没看懂T(*)[]是什么意思?
|
t****t 发帖数: 6806 | 11 哦, 对的. 我糊涂了.
【在 X****r 的大作中提到】 : 指向每个成员类型为T的数组的指针?写得不对?
|
k***r 发帖数: 4260 | 12 T**也可以,不过要多次分配内存。
oranges.
【在 a****l 的大作中提到】 : you should ask "T[][] vs T*", otherwise you are comparing apples to oranges.
|
b*****j 发帖数: 1335 | 13 没这么复杂.
T[] ~ T*
因为T[i] ~ T[i]
T[][] ~ T**
因为T[i][j] ~ T[i][j]
而且都可以不等长
【在 X****r 的大作中提到】 : 就结构而言Java里非primitive类型类似于C里对应的指针类型, : 所以如果T是primitive的话,Java里T类似于C里的T, : Java里T[]类似于C里的T(*)[], : Java里T[][]类似于C里的T(*(*)[])[]; : 如果T不是primitive的话,Java里T类似于C里的T*, : Java里T[]类似于C里的T*(*)[], : Java里T[][]类似于C里的T*(*(*)[])[]。 : 就语法而言Java里非primitive类型存取不需要加*。
|
w***g 发帖数: 5958 | 14 这个是对的。int **T 在不是顺序访问每行的情况下是最慢的做法。应该用int *T每次
手工算offset。这一点我有过深刻的教训。
need
treats
address
【在 h*********e 的大作中提到】 : int 'int T[][]' and 'int **T' are very very different. : I think T[][] is easier to use as well as to allocate, because all you need : for T[m][n] is a matrix of m by n. And I guess the compiler actually treats : it as a one dimensional array. T is then a constant and contains the address : of the 1st element. : With **T, you need : 1) m arrays (rows), each of which contains n elements (columns) : 2) an array of m elements, each pointing to one of the m rows : 3) a pointer to a pointer to T, pointing to the 1st
|