| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 22136 人关注过本帖, 3 人收藏
标题:C日记~立标记~
只看楼主 加入收藏
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
然后把代码改改~其实可以不设指针数组集的单位长度限制~~~~

可以读取不同数据长度的数据~不过这样要防止越界才行~~

程序代码:
#include<stdio.h>
int main()
{
    int a[][3]={{10,20,30},{40,50,60},{70,80,90}};
    char b[][4]={{'a','b','c','d'},{'e','f','g','h'},{'i','j','k','l'},{'m','n','o','p'}};
    void* (*p[2])[]={0};

    int i=0;
    int j=0;
    
    (int (*)[sizeof(*a)/sizeof(**a)])p[0]=(int (*)[sizeof(*a)/sizeof(**a)])a;
    (char (*)[sizeof(*b)/sizeof(**b)])p[1]=(char (*)[sizeof(*b)/sizeof(**b)])b;

    for (i=0;i<sizeof(a)/sizeof(*a);++i)
        for (j=0;j<sizeof(*a)/sizeof(**a);++j)
            printf("%-4d",((int (*)[sizeof(*a)/sizeof(**a)])p[0])[j][i]);

    puts("");

    for (i=0;i<sizeof(b)/sizeof(*b);++i)
        for (j=0;j<sizeof(*b)/sizeof(**b);++j)
            printf("%-4c",((char (*)[sizeof(*b)/sizeof(**b)])p[1])[j][i]);

    puts("");

    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-23 17:11
ZSPM
Rank: 1
来 自:家乡
等 级:新手上路
帖 子:75
专家分:3
注 册:2017-5-22
收藏
得分:0 
回复 10楼 renkejun1942
你回复下面的的一行文字是什么啊,怎么设置啊?

/**时间会收获最真的情感,风雨会考验最暖的陪伴*/
2017-05-23 17:32
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 101楼 九转星河
这样长度不同还是没有普片性~~还是建议使用时每个数组的一维长度要一致~因为强制转型的时候数组长度参数不能带有变量~~这也说明了某些编译器在处理数组长度方面的时候不是在编译过程中处理的~而是在预编译的时候处理的(这也是为什么一些老式编译器数组长度大小不能为变量的原因)~~~

顺带一句~sizeof 得出来的是常量~~是在预编译的时候已经转换成机器指令的常量~所以在编译过程中同一个sizeof的值是不会发生变化的~~~

PS:这种方法的适应度感觉还是不高~原因在于运算数据的转型是一个常量而不是变量所以如果要读取多维数据的话……还是要调用多维参数作为变量并在读取数据进行一维运算~如果数据类型不同就要调用数据单位长度参数作为变量获取内存数据~

所以得出结论就是本来就没有"维度"这个概念~有的只是数据类型影响影响指针偏移量~读取指针地址似乎是在读取"维度空间"~实际上是对数据进行转型并读取其中内容~所以如果要进行一些通用化操作就要进行"原子尺度"上的操作--既以字节为单位读取或者修改数据~所以如果要对多维数据进行定位的时候~除了用默认定义的变量类型或者强制转型的方法外~通用的方法就是对读取数据传入参数进行定位……~~~这样就意味着储存数据本身就没有数据类型这个概念~就光是一个值(不管那个储存值是什么)~~数据类型的作用只是存取或者修改的过程中对数据执行机器指令的处理~

还有一点值得一提~每个地址都对应一个值~每个值都对应一个地址(注意~地址本身是常量)~所以这样理解的话就不存在"地址级数"问题~所以*p的值有两种情况~一种是还是地址值(例如二维数组)~~另一种就是地址里面的储存内容(注意这里的"内容"可能是一个地址的"值"--例如二重指针)~~至于*p读取的是地址还是内容就要看*p的数据类型是否具有数组属性了~所以虽然指针虽然具有数组属性~但却不具备"长度"属性~~所谓对"长度"的理解有两点--第一点就是在长度作用范围之内的数据受"保护"(既不会被系统非法占用或改写)第二点就是读取地址的行为是以"地址"的形式而非"储存值"的形式---这样看的话int a[1]和int a看上去数据类型和占用单元都一样~但实际上前者具备"数组"属性而后者不具备~所以前者读取a的值是地址而后者是储存值~

所以数组合和指针是有一定区别的~~~~

[此贴子已经被作者于2017-5-23 18:55编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-23 17:41
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
今天自己帮休息一下~~~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-24 15:58
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
无意闲逛看了一个神级别的平方根倒数速算法~看过这个算法挺闻名的~不过理解上来就~~~~~

程序代码:
float InvSqrt(float x)

{

    float xhalf = 0.5f*x;

    int i = *(int*)&x; // get bits for floating VALUE

    i = 0x5f375a86- (i>>1); // gives initial guess y0

    x = *(float*)&i; // convert bits BACK to float

    x = x*(1.5f-xhalf*x*x); // Newton step, repeating increases accuracy

    return x;

}


反正现阶段我也没有去怎么消化~有兴趣的可以看看这方面的资料~~~

PS:我这个也是摘抄回来的~或许会搜到其它类似算法和这个有点出入~记得还有几个类似的版本~有兴趣的可以去了解一下~~~

[此贴子已经被作者于2017-5-24 18:10编辑过]


[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-24 17:22
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 105楼 九转星河
雷神之锤。。

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-24 17:28
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
无意闲逛~发现了一个很好玩的宏~看来我那个通用链表可以改进一下了~去查查offsetof宏的相关用法也好~

程序代码:
#include<stdio.h>
#include<stddef.h>
typedef struct Node
{
    int a[10];
    double b;
    char c;
}Node;
int main()
{
    Node node={0};
    
    printf("%d\n",offsetof(Node,a));
    printf("%d\n",offsetof(Node,b));
    printf("%d\n",offsetof(Node,c));
    
    return 0;
}

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-25 20:41
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 107楼 九转星河
结构成员的偏移量。

你不提我都忘记这个宏了。

[此贴子已经被作者于2017-5-25 20:46编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-25 20:43
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 108楼 renkejun1942
关键是a不能单独成为一个变量~这是一个实际应用问题~感觉这用法有点独特~~如果可以写成node.a则可以当一个完整的变量调用了~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-25 21:02
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
突然知道匿名指针是怎么回事了~就是指向一个地址加偏移量……是用来实现泛型的……其实可以自己开个内存块里面存放各种不同类型的数据~感觉结构体就是类似于这种结构而且还多个结构体成员作为引用接口……在堆空间里面理论上其实是可以用开辟内存空间附加一些引用方法来起到结构体效果的~~~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-25 21:35
快速回复:C日记~立标记~
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020022 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved