快上网专注成都网站设计 成都网站制作 成都网站建设
成都网站建设公司服务热线:028-86922220

网站建设知识

十年网站开发经验 + 多家企业客户 + 靠谱的建站团队

量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决

c语言数组存储函数 c语言数组在内存中的存储方式

C语言用数组存储大型数据的算法

/*

成都创新互联是一家集网站建设,龙游企业网站建设,龙游品牌网站建设,网站定制,龙游网站建设报价,网络营销,网络优化,龙游网站推广为一体的创新建站企业,帮助传统企业提升企业形象加强企业竞争力。可充分满足这一群体相比中小企业更为丰富、高端、多元的互联网需求。同时我们时刻保持专业、时尚、前沿,时刻以成就客户成长自我,坚持不断学习、思考、沉淀、净化自己,让我们为更多的企业打造出实用型网站。

size_a,pa——指向数组a的有效末端

ma——a的最大容量,必须大于na

n=12——求n的阶

p——求阶乘时的当前乘数

*/

#include

#define

Ma

10000

int

pa;/*指向数组a的有效末端*/

int

p=2;

int

memory_over=0;

union

data

{

unsigned

long

int

b;

struct

{unsigned

l:16;

unsigned

h:16;

}m;

}a[Ma];

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明1:考虑到result比较长,我用a[Ma].b来存储n!的result,每一位a[pa].b能存储4位10进制数字。

因为我定义的数组是静态的,所以Ma应该足够大。

ps:其实只用定义一个unsigned

long

int

b[Ma];就可以了(直接用b[pa]代替a[pa].b),但是我考虑到可能会访问每一结点b[pa]的高16位(a[pa].m.h)和低16位(a[pa].m.l),但是的我考虑是多余的!!不用像我这样定义这么复杂的共用体!!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

unsigned

int

cashe;

unsigned

int

carry;

void

main()

{

unsigned

int

n;/*求n的阶*/

void

facto(unsigned

int

n);

printf("Input

n:");

scanf("%u",n);

/*=================开始求阶乘!=============*/

a[0].b=1;/*初始化*/

facto(n);

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明2:上面这句直接调用facto(n)来求n!

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

/*========================以下是显示最后结果====================================*/

if(memory_over==0)

{printf("the

result

include

%dNO:\n",pa+1);

printf("%u",a[pa--].m.l);

for(;pa=0;pa--)

printf("%04u",a[pa].m.l);

printf("\n");

}

getch();

}

/*+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

算法说明2:求阶函数facto(n)说明:

这个函数会不断地调用multiple(),它的作用是每被调用一次就使得a[pa].b与阶数p相乘一次,直到乘完n为止!

{multiple();

p++;/*每一轮乘一个阶数p*/

}

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/

void

facto(unsigned

int

n)

{void

multiple();

pa=0;

while(paMa-1p=n)/*容量限制*/

{multiple();

p++;/*每一轮乘一个阶数p*/

}

if(p=n)

{printf("memory

out!\n");memory_over=1;}/*如果当前的存储结果的数组a[Ma]不够用!应提高Ma*/

}

/*==============================================================================

算法说明3:乘法函数multiple()说明:负责a[pa].b与阶数p相乘。

a[pa].b有很多结点,a[0].b、a[1].b、a[2].b、a[3].b、a[4].b、。。。

当然是从低结点a[0].b开始不断与p相乘,产生的“进位”加到高位a[1].b,直到a[pa].b*p为止!

随着结果数值增大,pa个结点的a[].b可能容纳不下结果,所以如果a[pa].b与p相乘后还有“进位”carry,就扩大pa,并把carry放入到新增加的结点:

if(carry0)

a[++pa].b=carry;

===================================================================================*/

void

multiple()

{int

i=0;

carry=0;

while(i=pa)/*i指向当前处理的元素a[i],每一轮用一个位与阶数p相乘*/

{a[i].b=a[i].b*p+carry;/*计算结果,要考虑来自低位的进位*/

carry=a[i].b/10000;/*计算进位*/

a[i].b=a[i].b%10000;/*计算余数*/

i++;

}

if(carry0)

a[++pa].b=carry;

}

C语言数组定义和存储。

不行的,c语言不允许动态的数组类型。你可以用指针实现:

int

n;

scanf("%d",n);

int

*a=(int*)malloc(sizeof(int)*n);

C语言 指针数组如何存放函数地址

1.函数指针的数组定义方法:返回值类型( * 指针变量名[Number]) (形参列表)。

例如:

double add(double a,double b){};

double sub(double a,double b){};

double mul(double a,double b){};

double div1(double a,double b){};

double (*oper_func[])(double, double) = {add,sub,mul,div1};//函数指针的数组定义

2.函数指针是指向函数的指针变量。函数指针有两个用途:调用函数和做函数的参数。

函数指针的声明方法为:

返回值类型( * 指针变量名) (形参列表);

“返回值类型”说明函数的返回类型,“( * 指针变量名)”中的括号不能省,括号改变了运算符的优先级。若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,后面的“形参列表”表示指针变量指向的函数所带的参数列表。

例子:

#includestdio.h

int max(int x,int y){return (xy? x:y);}

int main(){

int (*ptr)(int, int);

int a, b, c;

ptr = max;

scanf("%d%d", a, b);

c = (*ptr)(a,b);

printf("a=%d, b=%d, max=%d", a, b, c);

return 0;

}


名称栏目:c语言数组存储函数 c语言数组在内存中的存储方式
分享路径:http://6mz.cn/article/doeodsj.html

其他资讯