作者snowlike (snowlike)
看板C_and_CPP
标题Re: [问题] passing arg 1 of `load' from incompa …
时间Fri Oct 9 16:48:14 2009
※ 引述《james732 (好人超)》之铭言:
仅传递起始位址的作法应该这麽作
void set(int *ptr, int st, int ed, int th, int etc) {
int i, j, k, l;
for(i=0; i<st; ++i) {
for(j=0; j<ed; ++j) {
for(k=0; k<th; ++k) {
for(l=0; l<etc; ++l) {
printf("%d\t", ptr[i*ed*th*etc+j*th*etc+k*etc+l]);
}
printf("\n");
}
}
}
}
set((int*)ary, ...);
额外提供的;这不是转不转型的问题而已。考虑一个二维阵列
动态的方式:int **ary=malloc...懒得写了
你可以这麽使用它*(*(ary+i)+j)或是ary[i][j]
静态的方式:int ary[2][3]={{1,2,3},{4,5,6}};
你也可以这麽使用它*(*(ary+i)+j)或是ary[i][j]
但是如果将它转型成动态指标,就好像强制转型传递给函式那样
*(*( (int**) ary+i)+j)执行的时候是会产生错误的
动态的阵列取址的时候是像这样的
*(ary+i)所存的值是下一个维度的位址,对其作+j後再取值才是实际上所储存的资料
尝试着对"静态"阵列印出位址看看
print("%p", &ary[0]); //&*ary 第一个位置储存第二维位址的第一维位址
print("%p", &ary[0][0]); //&**ary 第一个位置储存实际资料的第二维位址
会得到一样的位址(动态分配的话会是不一样的)
如果将这样型态的东西强制当做动态指标来使用的话
当*(ary+i)的位址是指向自己本身的时候ary+i,是不会去找到*(*(ary+i)+j)
其实静态阵列不论几维都只有一个维度而已orz
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 114.33.184.50
1F:推 NDark:用五个回圈别闹了好吗...要是你跟我合作我一定重写你的code 10/09 17:24
2F:推 VictorTom:四个吧?? 不过那是原发问者他的code就四层的啦XD 10/09 17:37
3F:推 james732:我想请问一下 这样四层回圈我也觉得很丑 但该怎麽改写? 10/09 18:06
4F:推 VictorTom:下面就是答案啦, 直接用数学计算出正确的index啊XD 10/09 18:24