[分享] 双重指标小应用

楼主: jacky1989   2014-12-02 21:15:35
刚刚在指导学长使用双重指标,将心得分享上来
如果今天已经预先将值放在程式码内,而不用fopen去读档该怎么做
#include<stdlib.h>
#include<stdio.h>
//预先放置之副程式
void source(int **s){
*(*(s+0)+0) = 0;
*(*(s+0)+1) = 1;
*(*(s+1)+0) = 2;
*(*(s+1)+1) = 3;
}
int main(){
int **f;
int i,j;
//要先配置喔!
f = (int **)malloc(sizeof(*f)*2);
for(i=0;i<2;i++){
*(f+i) = (int *)malloc(sizeof(*f)*2);
}
//从副程式取值
source(f);
for(i=0;i<2;i++){
for(j=0;j<2;j++)
printf("%d ",*(*(f+i)+j));
printf("\n");
}
/*指标用完记得free啊!!指标用完记得free啊!!指标用完记得free啊!!
很重要,所以说三次(13诫之六)*/
for(i=0;i<2;i++)
free(*(f+i));
free(f);
system("pause");
return 0;
}
这方法好处是免用循环一直在读值,而且可以解决有些编译器没办法用fopen
像做嵌入式系统设计就不一定有fopen唷!
但是对初学者来说会糊里糊涂的,不知道自己在读什么值
有任何不好的地方欢迎高手指教谢谢
作者: x000032001 (版废了该走了)   2014-12-02 21:32:00
不就动态二维阵列而已@@?
作者: purpose (秀才遇到肥宅兵)   2014-12-02 22:28:00
*(*(s+1)+0) = 2; 写成 s[1][0] = 2; 就好,省力*(f+i) = (int *)malloc(sizeof(*f)*2); 你是要存整数吧*(f+i) = (int *)malloc(sizeof(int)*2); 就可以
作者: handsome616 (豆花伯爵)   2014-12-02 22:51:00
小声问什么情况要用循环一直读值?
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-02 23:03:00
看不太懂重点是什么,这跟双重指标有什么关系?要做同样的事情用阵列不就行了,程式码也少了快一半
作者: CaptainH (Cannon)   2014-12-02 23:44:00
只要编译期能决定大小的 都可以用阵列丢到全域变量我猜你所谓的错指执行时segmentation fualt这通常是因为stack不够的关系,放到全域变量可以解决动态内存配置是用来解决执行期才能得知大小的阵列。你的例子并没有表现出这点。
作者: bibo9901 (function(){})()   2014-12-03 00:22:00
我一直觉得"双重指标"是一个很奇怪名词双重人格、双重积分、双重国籍都是指"两个", 但是双重指标却是 pointer to pointer, 只有一个指标, 没有两个.就说啦, pointer to pointer指标的指标. 英文也没在讲 double pointer 的
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-03 00:44:00
双重指标很常见,double pointer 也是有人讲
作者: Bencrie   2014-12-03 01:08:00
用一维就好,index 自己算
作者: carylorrk (carylorrk)   2014-12-03 01:18:00
就算用 pointer to pointer 还是会先 allocate 一维的阵列吧?至少可以保持记 memory 的连续性。不过最好还是一维+自己算 index,因为多一层 dereference 有时差别挺大的。
作者: q82419 (q82419)   2014-12-03 03:10:00
*(*(s+1)+0) = 2; 不能写成 s[1][0] = 2; 13诫之12应该是 f = (int **)malloc(sizeof(*int)*2);跟 *(f+i) = (int *)malloc(sizeof(int)*2);要把值放进程式内通常会帮input建立成一个更完整一点的资料结构 包成struct class之类的
作者: ACMANIAC (請肥宅救救肥宅)   2014-12-03 05:04:00
楼上你搞错了,13诫之12 讲的是二维阵列不能用 pointerto pointer 传入,而不是指标不能改写成阵列形式...
作者: dirkc (3781615)   2014-12-03 18:02:00
全域或static阵列都可,或者用ulimit -s改默认stack大小如果有支援ulimit又有这个需求的话题外话,不管是 **p 或 ********p,我会都叫它们指标英文是pointer. A pointer to pointer is still a pointer.初始化的全域或static变量通常放在档案的.data区域中函式内的区域变量则通常用stack来管理
作者: johnpage (johnpage)   2014-12-04 08:20:00
三维动态阵列是多重指标吗?
作者: s25g5d4 (function(){})()   2014-12-04 11:30:00
个人比较偏好 sizeof(int*)*m + sizeof(int)*m*n
作者: saladim (杀拉顶)   2014-12-04 19:38:00
程式有错 你把type换成double就出错了
作者: loveme00835 (发箍)   2014-12-05 02:18:00
好恐怖喔… 我一定会用 ADT 封装起来,两个星星以上理解不能
作者: scwg ( )   2014-12-05 02:43:00
回圈里的 malloc 应该是 sizeof(**f)*2, 不然 f 宣告成double ** f; 空间就没拿够
作者: lepin2001 (排年代的票真闷)   2014-12-08 00:45:00
推心得分享

Links booklink

Contact Us: admin [ a t ] ucptt.com