谁的QQ分组是这样的,跪求截图工具,万分

C语言一维数组的定义和引用_C语言中文网
&&/&&&&/&&
C语言支持一维数组和多维数组。如果一个数组的所有元素都不是数组,那么该数组称为一维数组。
一维数组的定义方式
在C语言中使用数组必须先进行定义。一维数组的定义方式为:
& & 类型说明符 数组名 [常量表达式];
其中,类型说明符是任一种基本数据类型或构造数据类型。数组名是用户定义的数组标识符。方括号中的常量表达式表示数据元素的个数,也称为数组的长度。例如:
int a[10];
/* 说明整型数组a,有10个元素 */
float b[10], c[20];
/* 说明实型数组b,有10个元素,实型数组c,有20个元素 */
char ch[20];
/* 说明字符数组ch,有20个元素 */
对于数组类型说明应注意以下几点:
1) 数组的类型实际上是指数组元素的取值类型。对于同一个数组,其所有元素的数据类型都是相同的。
2) 数组名的书写规则应符合标识符的书写规定。
3) 数组名不能与其它变量名相同。例如:
float a[10];
是错误的。
4) 方括号中常量表达式表示数组元素的个数,如a[5]表示数组a有5个元素。但是其下标从0开始计算。因此5个元素分别为a[0], a[1], a[2], a[3], a[4]。
5) 不能在方括号中用变量来表示元素的个数,但是可以是符号常数或常量表达式。例如:
#define FD 5
int a[3+2],b[7+FD];
是合法的。但是下述说明方式是错误的。
6) 允许在同一个类型说明中,说明多个数组和多个变量。例如:
int a,b,c,d,k1[10],k2[20];
一维数组元素的引用
数组元素是组成数组的基本单元。数组元素也是一种变量, 其标识方法为数组名后跟一个下标。下标表示了元素在数组中的顺序号。数组元素的一般形式为:
& & 数组名[下标]
其中下标只能为整型常量或整型表达式。如为小数时,C编译将自动取整。例如:
& & a[i+j]
& & a[i++]
都是合法的数组元素。
数组元素通常也称为下标变量。必须先定义数组,才能使用下标变量。在C语言中只能逐个地使用下标变量,而不能一次引用整个数组。例如,输出有10个元素的数组必须使用循环语句逐个输出各下标变量:
for(i=0; i&10; i++)
printf(&%d&,a[i]);
而不能用一个语句输出整个数组。因此,下面的写法是错误的:
printf(&%d&,a);
【例7-1】使用for循环为一个数组赋值,并将数组倒叙输出。
#include &stdio.h&
int main(void){
int i,a[10];
for(i=0;i&=9;i++)
for(i=9;i&=0;i--)
printf(&%d &,a[i]);
【例7-2】将上面的例子稍微改变一下。
#include &stdio.h&
int main(void){
int i,a[10];
for(i=0;i&10;)
for(i=9;i&=0;i--)
printf(&%d&,a[i]);
一维数组的初始化
给数组赋值的方法除了用赋值语句对数组元素逐个赋值外, 还可采用初始化赋值和动态赋值的方法。
数组初始化赋值是指在数组定义时给数组元素赋予初值。数组初始化是在编译阶段进行的。这样将减少运行时间,提高效率。初始化赋值的一般形式为:
& & 类型说明符 数组名[常量表达式] = { 值, 值&&值 };
其中在{ }中的各数据值即为各元素的初值,各值之间用逗号间隔。例如:
int a[10]={ 0,1,2,3,4,5,6,7,8,9 };
a[0]=0; a[1]=1 ... a[9]=9;
C语言对数组的初始化赋值还有以下几点规定:
1) 可以只给部分元素赋初值。当{ }中值的个数少于元素个数时,只 给前面部分元素赋值。例如:
int a[10]={0,1,2,3,4};
表示只给a[0]~a[4]5个元素赋值,而后5个元素自动赋0值。
2) 只能给元素逐个赋值,不能给数组整体赋值。例如给十个元素全部赋1值,只能写为:
int a[10]={1,1,1,1,1,1,1,1,1,1};
而不能写为:
int a[10]=1;
3) 如给全部元素赋值,则在数组说明中,可以不给出数组元素的个数。例如:
int a[5]={1,2,3,4,5};
int a[]={1,2,3,4,5};
一维数组程序举例
可以在程序执行过程中,对数组作动态赋值。这时可用循环语句配合scanf函数逐个对数组元素赋值。
【例7-4】输入10个数字并输出最大值。
#include &stdio.h&
int main(void){
int i,max,a[10];
printf(&input 10 numbers:\n&);
for(i=0;i&10;i++)
scanf(&%d&,&a[i]);
for(i=1;i&10;i++)
if(a[i]&max) max=a[i];
printf(&maxmum=%d\n&,max);
本例程序中第一个for语句逐个输入10个数到数组a中。 然后把a[0]送入max中。在第二个for语句中,从a[1]到a[9]逐个与max中的内容比较,若比max的值大,则把该下标变量送入max中,因此max总是在已比较过的下标变量中为最大者。比较结束,输出max的值。
【例7-5】输入10个数字并按从大到小的顺序排列。
#include &stdio.h&
int main(void){
int i,j,p,q,s,a[10];
printf(&\n input 10 numbers:\n&);
for(i=0;i&10;i++)
scanf(&%d&,&a[i]);
for(i=0;i&10;i++){
p=i;q=a[i];
for(j=i+1;j&10;j++)
if(q&a[j]){
p=j;q=a[j];
a[i]=a[p];
printf(&%d&,a[i]);
本例程序中用了两个并列的for循环语句,在第二个for 语句中又嵌套了一个循环语句。第一个for语句用于输入10个元素的初值。第二个for语句用于排序。本程序的排序采用逐个比较的方法进行。在i次循环时,把第一个元素的下标i赋于p,而把该下标变量值a[i]赋于q。然后进入小循环,从a[i+1]起到最后一个元素止逐个与a[i]作比较,有比a[i]大者则将其下标送p,元素值送q。一次循环结束后,p即为最大元素的下标,q则为该元素值。若此时i&p,说明p,q值均已不是进入小循环之前所赋之值,则交换a[i]和a[p]之值。 此时a[i]为已排序完毕的元素。输出该值之后转入下一次循环。对i+1以后各个元素排序。
更多关于排序的内容请查看:
推荐文章 TOP10C语言从零开始(十二)-一维数组 - 简书
C语言从零开始(十二)-一维数组
什么是数组
数组是有序数据的集合,在内存中是一段连续的存储空间。用来保存一组相同类型的数据。假如我们需要保存1~100这100个整数,如果用100个int变量保存太不方便,于是就有了数组。
我们今天主要介绍一维数组。大家可以把一维数组理解为一组数字排成一列保存在内存中。
一维数组的定义
数据类型 数组名[常量];
int a[10];
这句话定义了一个长度为10的int型数组。它能够保存10个整数。
一维数组元素的引用
数组元素的引用形式如下:
数组名[下标]
这里需要区别于数组的定义形式,前面的“常量”表示数组长度,这里的“下标”指的是元素的个数。注意:下标是从0开始计算的。例如一个有10个元素的int型数组,下标范围是0~9。后面会具体说明。
一维数组的初始化
1. 定义时赋初值
int a[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
这句话定义了一个10个元素的int型数组,里面保存了10个数字。大括号中的10个数字就是数组a的初值。
注意,大括号中的数字个数可以小于数组长度。
2. 全赋值0
如果想在a[10]中保存10个0,有两种写法:
int a[10] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
int b[10] = {0};
数组a和b的内容相同。
3. 可以不指定长度
int a[] = {1, 2, 3, 4, 5};
这句话定义了一个长度为5的数组a,赋值1,2,3,4,5。
数组的用法比较灵活,对于初学者而言理解起来不太容易。我们这里不要求大家一下全部掌握,我们通过一段程序来了解具体怎么使用。
int main()
int a[10] = {0}; // 数组a赋值
// 打印数组中的10个元素
for (i = 0; i & 10; i++)
printf("%d ", a[i]);
printf("\n");
// 数组a赋值为 1, 2, 3, 4, 5, 6, 7, 8, 9, 10
for (i = 0; i & 10; i++)
a[i] = i + 1;
// 打印数组中的10个元素
for (i = 0; i & 10; i++)
printf("%d ", a[i]);
printf("\n");
执行结果如下:
需要注意的是,在利用下标访问数组a时,如果下标大于等于数组长度,系统会报错,叫做数组访问越界。这是必须要牢记的。
请大家仔细学习这段代码,力求熟练掌握。一维数组的使用会贯穿于后面的例子,这里就不过多讲解了。
字符串数组拼接练习。
有两个字符数组a和b,请把它们拼接成一个新的字符串保存在字符串c中,并打印出来。
int main()
char a[] = {'a', 'b', 'c', 'd', 'e'};
char b[] = {'f', 'g', 'h', 'i', 'j'};
char c[10];
// -----------------------
// -----------------------
for (i = 0; i & 10; i++)
printf("%c ", c[i]);
上面给出了一个代码片段,请在两行横线中写出拼接代码,使得最终输出结果为:a b c d e f g h i j
我是,让我们一起在软件开发中自我迭代。如有任何问题,欢迎与我联系。
上一篇:下一篇:
从业多年的资深软件工程师一枚~
- 热爱写作,拥有强烈的知识分享欲望
- 软件猎奇爱好...C语言的一维数组名和对数组名取地址
我的图书馆
C语言的一维数组名和对数组名取地址
相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针,指向函数的入口地址。现在又这样一个问题,如果对数组名取地址,那得到的会是什么呢?很多人立刻会想到:给指针取地址,就是指针的指针,既二级指针嘛!当然这样的结论是错误的。。。下面我们来逐步分析,下面是一段验证这个问题的代码Code:#include&stdio.h&&&&int main() &&{ &&&&&& int a[10]; &&&&&&&& printf("a:\t%p\n", a);&&&&&&&&& &&&&&& printf("&a:\t%p\n", &a);&&&&&&& &&&&&& printf("a+1:\t%p\n", a+1);&&&&& &&&&&& printf("&a+1:\t%p\n", &a+1);&& &&&&&&&& return 0; &&}&&&大家可以编译运行一下,我的输出的结果是:Code:/*&&&a:&&&&&&&&&& 0012FF20&&&a:&&&&&&&&& 0012FF20&&a+1:&&&&&&&& 0012FF24&&&a+1:&&&&&& 0012FF48&&*/&& a和&a指向的是同一块地址,但他们+1后的效果不同,a+1是一个元素的内存大小(增加4),而&a+1增加的是整个数组的内存大小(增加40)。既a和&a的指向和&a[0]是相同的,但性质不同!读到这里,有很多朋友已经明白其中的机制了,如果还是有些模糊,请继续往下看Code:int main() &&{ &&&&&& int a[10]; &&&&&& printf("%d\n",sizeof(a)); &&&&&& return 0; &&}&& 这段代码会输出整个数组的内存大小,而不是首元素的大小,由此我们是否联系到,sizeof(a)这里的a和&a有些相同之处呢?! 是的,没错,&a取都得是整个数组的地址!既数组名取地址等价于对数组取地址。好了,让我们总结一下,如果你还是不太理解,不用担心,下面的概念很清晰其实a和 &a结果都是数组的首地址,但他们的类型是不一样。a表示&a[0],也即对数组首元素取地址,a+1表示首地址+sizeof(元素类型)。&a虽然值为数组首元素地址,但类型为:类型 (*)[数组元素个数],所以&a+1大小为:首地址+sizeof(a)。还有最初提到的指针的指针的那个错误结论,其实即使不懂上述内容,也应该判断出结论是错误的,大家应该在了解数组名即是数组的首地址的同时,也要知道,数组名仅仅是“相当”于指针,而并非真的是指针,数组名是只是个常量(一个值为数组首元素地址的常量),所以不能进行++或者--运算。而常量更是无法取地址的,而之所以有&a,其实这里的a的意义早已经不是当初那个数组名了,它此时代表了整个数组。
TA的最新馆藏trackbacks-0
近来在写程序的时候遇到了一个问题,就是传递一个数组指针进入一个函数的时候,虽然指针能够顺利的传递,但是,我们无法求出该数组的大小。见下面的代码:
#include&&stdio.h&void&setNum(int&*p,int&a);void&setNum(int&*p);int&main(){&&&&int&a[]&=&{<span style="COLOR: #,<span style="COLOR: #,<span style="COLOR: #,<span style="COLOR: #};&&&&printf("%d\n",sizeof(a)/sizeof(a[<span style="COLOR: #]));&&&&setNum(a);}void&setNum(int&*p,int&a){&&&&*p&=&a;}void&setNum(int&*p){&&&&int&Num&=&sizeof(p)/sizeof(p[<span style="COLOR: #]);&&&&printf("%d\n",Num);}
结果是,输出分别是4和1.原因分析:1.对于第一个输出,由于在main函数中定义的为数组,所以可以直接利用sizeof函数来求出a数组的长度。2.对于传递参数类型,比如上面的setNum函数(未传递个数版本),此时,调用该函数的时候,a退化为一个普通的指针,也就是说,此时sizeof(p)求出来的就是一个指针的大小,除以int的大小,恰好为1.启示:C语言中,不能够根据一个数组指针就求出来任意一个数组的大小。解决办法就是传第一个参数进来,指定大小。ps:参考资料(详实):摘录:& & 如果作为函数的参数是没法求的,&& & 但这样是可以的:&& &&& & #define & LENGTH(s) & (sizeof(s) & / & sizeof(int))&& &&& & int & s[12];&& & int & length & = & LENGTH(s);&==================================================&这样的方法只能用于数组变量的数组名,对于指向数组的指针,以及作为参数的数组名都是没有效果的,上面已经有人解释了&》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》不可能有办法的。&当你定义一个数组的时候:&int & a[] & = & {1, & 2, & 3}; & & // & 实际上被编译为 & int & a[3] & = & {1,2,3}&数组名代表的是数组的地址。注意 & —— & 你绝对没有办法通过数组名动态获得数组的大小。当你丢失a的长度信息的时候,你永远不可能知道他的长度。&那么 & sizeof & 是怎么回事呢?他不是通过 & a & 的名字获得 & a的大小了么? & —— & 大错特错!&关键字 & sizeof & 产生的是一个编译期常量(注1) & 他的运作方式是这样的:&当你写:&sizeof & a &&实质是:&sizeof & ( & a的类型 & )&而a的类型是什么呢?编译器察看 & a的定义发现, & 是 & int & [3]&就是说,这里 & sizeof & a & 实质是:&sizeof & ( & int[3] & )&完全等同于常量 & 12 & (假定int为4字节)。&考虑一个函数&void & func( & int & a[] & ); & &&// & 写成 & int & a[3] & 也不会有本质区别——也许你该试试写成 & int & (&a) & [3] & ?&C++规定,数组作为形参的时候,a代表数组首地址。&他的底层意义是: & a & 退化为了一个4字节的指针,没有任何变量表示数组的大小会&#8220;自动&#8221;被传递进来。&我们看看这个时候 & sizeof & a是什么:&sizeof( & 函数形参的a[] & ) & & = & sizeof( & int* & const & ) & = & 4 & & // & 当然a[]不是合法的C++类型&仍然不服气?好——我们反问一个问题:若你是C & /C++的设计者, & 你怎么在兼容原有设计的基础上让void & func( & int & a[] & )同时传递地址和大小?&首先,a是一个变量,而且类似数组。他必须是一个地址,否则你不知道如何索引元素。&他怎么再带上一个变量表示他的大小呢?&扩充 & sizeof & (a) & 的能力?&sizeof & a & 必须产生代码——不管是常量还是什么。 & 要让他在运行时决定 & a的值, & a就必须带上他的大小信息。 &&1 & 你必须修改C标准,让C支持&#8220;两种&#8221;数组。一种是定义处的数组,他分配大片连续内存,和原来的C标准相同。&2 & 另一种是作为参数传递数组。 & 你必须传递地址和数组大小;这个数组实际上是一个8字节的结构{ & 地址; & 大小}(事实上可能更加复杂,考虑多纬数组如何实现? & ) &&3 & 系统必须根据两种不同数组分别实现其 & []、* & 、&等。 & 原有的数组根据其首地址偏移(这是个常量)和下标寻址; & 而参数数组则首先取&#8220;地址&#8221;内容(这是个变量),然后根据这个地址寻址....&厄... & 再考虑多维数组——听起来这不是一整套vector模型么?&-----------------------------------------------&注1: & 对于C99支持的 & flexible & array & ,其 & sizeof & 运算是运行时求值
阅读(9581)
272823456789101112141516171819202122232425262728293031123456789
留言簿(11)
随笔分类(87)
随笔档案(145)
文章分类(70)
文章档案(70)
ACM与算法比赛
LaTex和Tex学习
电子书下载
英语网站(长期学习)
积分与排名
阅读排行榜
评论排行榜

我要回帖

更多关于 截图软件 的文章

 

随机推荐