装修网线布置图一米线工钱多少元

C语言数组详细讲解_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
C语言数组详细讲解
上传于|0|0|文档简介
&&C语言数组详细讲解
阅读已结束,如果下载本文需要使用1下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩2页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢在标准C和C++中,长度为0的数组是被禁止使用的。不过在GNU C中,存在一个非常奇怪的用法,那就是长度为0的数组,比如Array[0];很多人可能觉得不可思议,长度为0的数组是没有什么意义的,不过在这儿,它表示的完全是另外的一层意思,这个特性是不可移植的,所以,如果你致力于编写可移植,或者是稍稍需要跨平台的代码,这些Trick最好还是收起来的好。在GNU的指南中,它是如此写道:struct line {char contents[0];};//...ommit code here{struct line *thisline &&&= (struct line *) malloc (sizeof (struct line) + this_length);thisline-&length = this_}这个用法主要用于变长Buffer,struct line的大小为4,结构体中的contents[0]不占用任何空间,甚至是一个指针的空间都不占,contents在这儿只是表示一个常量指针,这个特性是用编译器来实现的,即在使用thisline-&contents的时候,这个指针就是表示分配内存地址中的某块buffer,比如malloc (sizeof (struct line) + this_length)返回的是0x8f00a40,thisline-&contents指向的位置就是(0x8f00a40 + sizeof(struct line)),而这儿sizeof(struct line)仅仅是一个int的四字节。对于这个用法,我们定义的结构体指针可以指向任意长度的内存buffer,这个技巧在变长buffer中使用起来相当方便。可能有朋友说,为什么不把最后的contents直接定义为一个指针呢?这儿的差别是这样的,如果定义为一个指针,它需要占用4Bytes,并且在申请好内存后必须人为赋地址才可以。如果使用这个用法,这个常量指针不占用空间,并且无需赋值。但是,方便并不是绝对的,在释放分配的内存的时候,由于函数free会认为*thisline 只是指向一个4字节的指针,即只会释放length的空间,而对于后面占据大头的buffer却视而不见,这个就需要人为干预;而对于后面的声明指针的方式,则可以直接用Free(thisline-&contents)的方式释放掉分配的内存。ASSERT:除非必要,不要轻易使用这个功能,GNU C下可以编译通过,所以你在使用vc++,那就不用尝试了,编译都无法通过。
你说
在释放分配的内存的时候,由于函数free会认为*thisline 只是指向一个4字节的指针,即只会释放length的空间
这是不对的, free() 函数的参数类型是 void *, 所以它根本就不管参数是指向一个4字节的内存, 还是8字节的内存, free() 只会根据内存块的管理记录来释放, 因此只需要调用
free(thisline)
就可以将全部的内存(包括分配给contents的内存)都释放掉.
快乐至上. 秋本 Akimoto (true autumn) 明 Akira (bright)---日语名字 T...
薄荷糖的最新日记
······
&(1人喜欢)
&(2人喜欢)
&(3人喜欢)
······
如果让我来做毕业演讲 · 84条内容
你论文写完了吗? · 631条内容
最好的时代,最坏的时代 · 404条内容
就是那么简单几句我办不到 · 2354条内容
博物馆讲述难以言说的历史 · 365条内容
纪念汪老逝世二十周年 · 164条内容
推荐这篇日记的豆列
······怎么在多文件中共用一个常量数组 - C语言当前位置:& &&&怎么在多文件中共用一个常量数组怎么在多文件中共用一个常量数组&&网友分享于:&&浏览:54次如何在多文件中共用一个常量数组?现在有一常量数组:
const & unsigned & char & Text5[5]={ 'A ', 'B ', 'C ', 'D '}
此数组需要在多个func1.c,func2.c,func3.c....中引用,
请问大家需要如何定义这个数组?
我现在是把这个数组定义在一个constvalue.h中:
#ifndef & _CONSTVALUE_h
#define & _CONSTVALUE_h
const & unsigned & char & Text5[5]={ 'A ', 'B ', 'C ', 'D '};
然后通过在func1.c,func2.c,func3.c....中引用include &constvalue.h & & 并使用,
但是编译提示:
multiple & definition & of &
编译环境:Dev-C++,winxp & pro
大家有其他办法吗?------解决方案--------------------用extern.
------解决方案--------------------在其他C文件前面写上
extern Text5;
好像就可以了,试下。
------解决方案--------------------在.c文件中定义const unsigned char Text5[5]={ 'A ', 'B ', 'C ', 'D '};
在.h文件中声明extern const unsigned char Text5[5];
------解决方案--------------------在头文件中用
extern const unsigned char Text5[5];
然后在1个C文件中用
const unsigned char Text5[5]={ 'A ', 'B ', 'C ', 'D '};
这样编译这个C文件生成的obj文件中会包含一个Text5[]
其它include了这个头文件的C文件在编译时,extern会告诉编译器这是一个外部符号,生成的obj中就只有对Text5[]的引用
然后当link时,联接器发现这是一个外部符号,就会到其它obj文件中寻找Text5[],然后把它的地址写入引用它的地方,从而完成联接
12345678910
12345678910
12345678910 上一篇:下一篇:文章评论相关解决方案 12345678910 Copyright & &&版权所有C语言的数组学习入门之对数组初始化的操作
投稿:goldensun
字体:[ ] 类型:转载 时间:
这篇文章主要介绍了C语言的数组学习入门之数组初始化的操作,是C语言入门学习中的基础知识,需要的朋友可以参考下
数组在所有的语言中,以C最为简单,就是一起始地址,外加一数组的长度,而且基本上没有任何功能可言。然而,在所有的数组使用中,却是C的这种简单的数组形式,以其灵活性和效率,让人惊叹。
C数组从逻辑上讲,是分形一致的(想不到其他词来形容了),分形的意思,就是部分与整体保持一致的构造形式,也即是数组的任何一部分也都是数组,比如一整型数组{1,2,3,4,5},连续取出其中任一连续的部分,都可以看成是一个数组,{2,3}是数组,{1,2,3}是数组,{4,5}也都是数组,差别只在于数组的起始地址和元素的个数。那怕是数组中的任何一个元素,都可以看成是一个长度为1的数组。因此,C数组的这种统一的格式,在作为参数,传递给函数的时候,特别是递归函数中,很是方便。
一些基础知识
先来看看一些基础的东西。
数组可以用一个列值来初始化,例如:
int arr[] = {1,2,3,4};
char arr[] = {'a','b','c',0};
简单的一个整数数组初始化例子:
#include "stdio.h"
int main()
author: www.nowamagic.net
int arr[] = {1,2,3,4};
length = sizeof(arr) / sizeof(int);
printf("sizeof(arr)为:%d\n", sizeof(arr));
printf("sizeof(int)为:%d\n", sizeof(int));
printf("数组长度为:%d\n", length);
for(i = 0; i & i++)
printf("%d\n", arr[i]);
程序运行结果:
sizeof(arr)为:16
sizeof(int)为:4
数组长度为:4
简单的一个char数组初始化例子:
#include "stdio.h"
int main()
author: www.nowamagic.net
char arr[] = {'a','b','c',0};
length = sizeof(arr) / sizeof(char);
printf("sizeof(arr)为:%d\n", sizeof(arr));
printf("sizeof(char)为:%d\n", sizeof(char));
printf("数组长度为:%d\n", length);
for(i = 0; i & i++)
printf("%c\n", arr[i]);
程序运行结果:
sizeof(arr)为:4
sizeof(char)为:1
数组长度为:4
假设给一二维数组初始化,将数组的每个元素都初始化为0
方法有两种:
1)使用循环逐个的把数组的元素赋值为0;
2)使用内存操作函数memset将数组所占的内存内容设置为0;
测试代码如下:
#include &stdio.h&
#include &stdlib.h&
#include &mpi.h&
#include &string.h&
int main(int argc, char** argv)
o_centers[K*DIM];
i = 0, j = 0, k = 0;
MPI_Init(&argc, &argv);
printf("Start to test array assign...\n");
starttime1 = MPI_Wtime();
for(k = 0; k & LOOP; k++)
for(i = 0; i & K; i++)
for(j = 0; j & DIM; j++)
o_centers[j + i*DIM] = 0;
endtime1 = MPI_Wtime();
printf("Array assign takes %5.12f seconds...\n", endtime1 - starttime1);
printf("Start to test memset assign...\n");
starttime2 = MPI_Wtime();
for(k = 0; k & LOOP; k++)
memset(o_centers, 0, K*DIM*sizeof(double));
endtime2 = MPI_Wtime();
printf("Memset assign takes %5.12f seconds...\n", endtime2 - starttime2);
MPI_Finalize();
编译运行后,得到结果:
Start to test array assign...
Array assign takes 0. seconds...
Start to test memset assign...
Memset assign takes 0. seconds...
如果数组定义的时候没有指定其大小,并且初始化采用了列表初始化,那么数组的大小由初始化时列表元素个数决定。所以上面例子中的数组分别为 int[4] 和char[4]类型。如果明确指定了数组大小,当在初始化时指定的元素个数超过这个大小就会产生错误。
如果初始化时指定的的元素个数比数组大小少,剩下的元素都回被初始化为0。例如:
int arr[8]={1,2,3,4};
int arr[8]={1,2,3,4,0,0,0,0};
字符数组可以方便地采用字符串直接初始化。
C的字符串,也很简单,它也是一个数组,只不过最后一个元素是'\nul',加了这么一点限制之后,字符串自然就失去了数组的分形强悍,但C的字符串依然不可小看,因为字符串中,只要带上了'\nul',都能看成是字符串,好比,”hello”这条字符串,只要改变起始地址,就可轻而易举地得到”ello”,”llo”,”lo”,”o”这好几条子字符串,这个特点,可以简化很多字符串操作,并且效率最高。此外,C字符串,只要你愿意,完成可以拿来当成是字符数组来使用,这样,就又恢复了数组分形功能,C函数库中和WINDOWS API,有很多函数就是专门处理C字符数组的。
C的很多东西,就是这样,因为简单,所以强大得另人惊叹。函数、结构体、数组、GOTO、枚举这些简单的东西,巧妙的配合使用,可以玩出很多很多意想不到的神奇功能出来,令人击节赞叹,而且不会像C++那样,存在着所谓的什么心智负担。此外,C中的宏,嘿嘿,俺就不提了,变化多端,鬼神莫测。对于C,我越来越敬畏,它远远不似表面上看的那么简单,其背后自然潜藏着一套精神规则。即使看到每一行C代码,内心都能知道它的相应的汇编代码,那又怎么样,它总是有办法让你惊喜不已。
C CodeBase 计划:对于编程问题,消灭一点,舒服一点;消灭很多,舒服很多;彻底消灭,彻底舒服。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具2012年7月 C/C++大版内专家分月排行榜第二2012年6月 C/C++大版内专家分月排行榜第二
本帖子已过去太久远了,不再提供回复功能。

我要回帖

更多关于 装修网线如何布置 的文章

 

随机推荐