- 2022-08-23 发布 |
- 37.5 KB |
- 53页
申明敬告: 本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
文档介绍
c语言学习笔记(数组、函数)
数组2010-3-2922:40一维数组的定义和一维数组的引用内存中一串连续的存储单元(变量),叫数组。指针移动和比较只有在一串连续的数组中才有意义。当数组中每个变量只带一个下标时,为一维数组。定义一个一维数组:类型名数组名【常量表达式】如:inta[8];说明:①定义一个一维整型名为a的数组。②方括号中规定此数组有8个元素,(a【0】-a【7】),不存在a【8】这个元素。③a数组中每个元素均为整型,且每个元素只能存放整型。④每个元素只有一个下标,且第一个元素的下标总为0。⑤c编译程序,为a数组开辟8个连续存储单元。3)在定义数组语句中,可以有多个数组说明符;它们用逗号隔开。例:doublea【22】,v【100】,u【5】,a,b,c;注:双精度型每个单元占用8个字节的存储空间。另外,也可以和普通变量一起定义。 用逗号分隔开。\n2010-3-2310:29一维数组元素的引用21)引用形式:数组名【下标表达式】可以是:常量,变量,表达式。如:doublex【8】则x【0】x【j】x【i+k】均合法2)(1)一个数组元素实际上就是一个变量名,代表内存中的一个存储单元。我们可以把数组元素看做一个变量名来处理。(2)一个数组不能整体引用,数组名中存放的是一个地址常量,它代表整个数组的首地址。当学习指针时,引用的变量的地址,就是变量中第一个字节的地址。数组的首地址也是它的第一个元素的第一个字节的地址,即它的首地址。数组的首地址存放在数组名中。所以说,数组名就代表一个地址。数组名是一个地址值。(3)在引用数组元素时,数组元素下标表达式必须是整数,下标表达式下限为0.系统并不自动检验数组元素下标是否越界,因此编程时要注意。如:doublea,b;intc[10];a=2.0;b=3.0;则a[i];是不合法的。\n给数组赋初值时,如果所赋初值少于元素个数时,后面的元素补为0,字符补为’\0’可以通过赋初值来定义一个数组的大小。如:inta[]={0,0,0,0,0};相当于:a[5]={0};一维数组的初始化voidmain(){inti,j,a[30];for(i=0,j=1;i<30;i++,j+=2)a[i]=j;for(i=0;i<30;i++){if(i%10==0)printf(“\n”);/*i等于10,到了十,输入回车。因为0-9就是十个*/printf(“%d,”,a[i]);}for(i=29;i>=0;i--){printf(“%d,”,a[i]);if(i%10==0)printf(“\n”);/*先输出第i=20这个元素,再输入回车。*/}\ngetch();}//2010年10月14日14:43:15上次是怎么做的啊,错了那么多。1一维数组和数组元素的地址1)数组和指针的比较(1)指针变量的地址:指向内存中一个存储单元的第一个字节的地址。数组名的地址值,就是该数组的第一个元素的第一个字节的地址。(2)指针变量有基类型,相当于数组的类型名。(3)指针变量的地址值不可改变,即指针变量指向的存储单元的地址值是固定的,不可改变,如int*p,a;p=&a;则变量a的地址是不可改变的。也不可给数组名的地址重新赋值。如数组名为a的数组:a=&x;或a++等给数组名重新赋值都是错误的。一旦定义,a永远指向a数组的首地址。(4)虽然不可改变a的内容(地址),但可以对数组名加一个整数的办法,来依次表达该数组中不同元素的地址。如:a代表&a【0】数组的首地址,也是a[0]的地址//首地址a+1代表&a【1】数组元素a[1]的地址//在指针中,1代表一个存储单元a+2代表&a【2】......//注意:不是a=a+1,而是a+1\n例:main(){inta[10],*p,x,k;for(k=0;k<10;k++)p=a+k;//a是数组的首地址,p=a+k;则遍历了数组中每个元素for(k=0;k<10;k++)scanf("%d",a+k);//输入每个元素的值for(k=0;k<10;k++)printf("%d\n",a[k]);//打印每个元素的值getch();}p=&a[0];等价于p=a;以下语句等价:for(p=a,k=0;k<10;k++)p++;//将数组a的首地址赋给指针p,k从0到9,p++将遍历数组中每个元素的地址。依次指向数组a1,a2,a3......a9.for(p=a,k=0;k<10;k++){scanf("%d",p);p++;}for(p=a,k=0;k<10;k++)scanf("%d",p++);//什么自加自减运算符,当++在后面时,当前表达式的值不变,元素加1.for(p=a;p-a<10;p++)scanf(“%d”,p);\n2010.4.2通过数组首地址指针带下标的指针引用一维数组元素。引用一维数组中的某一个元素的方法:*:求当前地址的内容&:求当前内容的地址1a【i】2*&a【i】//*在定义语句时代表定义一个指针变量,当在执行语句部分时代表间址运算符,引用一个指针变量指向的地址的内容。&叫求地址运算符,求当前内容的地址。所以*和&就像乘号和除号一样,互相抵消了。3*(a+i):在数组名的地址上,加上i个存储单元。代表第(i+1)个元素,用间址运算符引用它,即等价于a[i]4当(p=a;||p=&a【0】)则*(p+i)等价于a[i]5当(p=a;||p=&a[0])则p[i]等价于a[i]//方括号不仅表示数组元素的记号,也是一种运算符.总结:引用一维数组元素a[i]的四种方法:a[i]*(a+i)若p=a,则p[i]*(p+i)表示a[i]的地址的方法:&a[i]a+ip+i都表示当前数组第i个元素的地址。以下代表什么:*(P--)a[i--]*--pa[--i]\n注:自加自减运算,p--等价于:m=p--m=pp=p-1//先赋值,(先取值)再改变--p等价于:m=--pp=p-1m=p//先改变,再赋值。(再取值)数组名a和指向数组的指针p的区别.前者不可变,不可运算,后者可以赋值,运算.a++是个赋值表达式3)逐个输出a数组中元素的值.for(k=0;k<10;k++)printf("%4d",*(a+k));for(k=0;k<10;k++)printf("%4d",a[k]);for(p=a,k=0;k<10;k++)printf("%4d",*(p+k));for(p=a,k=0;k<10;k++)printf("%4d",p[k]);for(p=a,k=0;k<10;k++){printf("%4d",*p);p++}//p++,即依次指向每一个元素。函数之间对一维数组和数组元素的引用及一维数组实例11数组元素作为实参\n在调用函数时,数组元素可以作为实参传送给形参,每个数组元素实际上代表内存中的一个存储单元和普通变量一样,对应的形参必须是类型相同的变量。2数组名作实参如果用数组元素作实参的话,数组元素的值,可以传送给形参中相同类型的一个变量,在函数中只能对该变量进行操作,而不能直接引用对应的数组元素。(只能改变形参的值,而不能改变实参即数组元素的值)。数组名也可以作为实参传送,对应的形参就应该是一个指针变量来引用调用函数中对应的数组元素,从而达到对调用函数中对应数组元素进行操作的目的。但数组名本身是一个地址值,因此,对应的形参就应当是一个指针变量。(该指针变量指向主调函数中数组的首地址)该指针变量就可以来引用主调函数中对应的任何一个数组元素,从而达到对主调函数中对应的数组元素进行操作的目的。引用方法:a【i】;*(a+i);p【i】;*(p+i)例:编写程序,通过函数给数组输入若干大于等于0的整数,用负数作为输入结束的标志;调用函数输出该数组中的数据。#defineM100intarrin(int*a){inti=0;scanf("%d",&a[i]);while(a[i]>=0)\n{i++;scanf("%d",&a[i]);}returni;}arrout(int*a,intn){inti;for(i=0;i查看更多
相关文章
- 当前文档收益归属上传用户