C语言一维数组初步学习笔记
数组
可以存储一组或者多组数值的变量,里面包含多个元素,数组的每个成员都是一个数组元素。
一维数组
定义:类型数组名[常量表达式]={值1,值2,值3…};
inta[3]={0,1,2}; floatf[2]={1.2,2.3,3.14}; charstr[]={'h','e','l','l','o'}; chatstr1="iPhone";//这也是定义字符数组的方法,字符数组后面会详细讲解,这里先了解一下
当数组元素个数为变量时,只能声明数组,不能直接赋值:
intlength=4; inta[length];//这样可以 inta[length]={2,4,6,8};//这样的话就会报错
注意事项:
1、系统不会检测数组元素的下标是否越界,编程时,必须保证数组下标不能越界。
2、不能这样定义数组intarray[]={};//数组个数和初始值不能同时为空
3、也不能这样定义数组intarray[2]={1,2,3};//数组的值的个数大于数组的个数
4、数组是一个整体,不能直接参加运算,只能对单个元素进行处理,通常用到数组的地方都会用到循环
常见数组操作
如果初始化数组的时候,数组的元素个数确定,那么常量表达式可以不写:
inta[]={1,3,5,7,9};//数组的长度为5相当于inta[5]={1,3,5,7,9};
int就是数组类型,表示这个数组中的每个元素都是int类型。
访问:通过数组名+下标去访问数组中的元素,而且注意数组的下标是从0开始的,a[0]就是第一个元素,a[1]代表第二个元素,a[2]代表第三个元素。所以数组的最后一个元素就是数组的长度–1,一定不要写a[3],这样的话就属于数组越界。
在数组的访问的时候我们通常会通过for循环来操作,这个操作一般称为遍历
intages[28]; //循环赋值 for(inti=0;i<28;i++) { intage=arc4random()%13+18;//每个人的年龄的范围是:18~30之间的随机值 ages[i]=age;//给每个元素赋值 } //访问,也叫遍历 for(inti=0;i<28;i++) { printf("a[%d]=%d",i,ages[i]); }
两个数组的每个元素对应相加,相加的和存放到第三个数组中:
inta1[]={2,4,5,6,10}; inta2[]={1,3,4,5,6}; inta3[5]; for(inti=0;i<5;i++) { a3[i]=a1[i]+a2[i]; printf("a3[%d]=%d",i,a3[i]); }
输出结果为:
a3[0]=3a3[1]=7a3[2]=9a3[3]=11a3[4]=16
数组的长度如何计算:
sizeof(数组名)/sizeof(数组第一个元素)
intarr[]={2,3,4,6,7}; intlength=sizeof(arr)/sizeof(arr[0]); printf("length=%d\n",length);
输出结果为:
length=5
字符数组:用于存放字符变量的数组称为字符数组,有两种定义格式:
charstr[4]={'a','b','c','d'}; charstr2[]="iPhone";//另外一种方式
字符串的输出:
printf("str2=%s\n",str2);//%s输出字符串,遇到'\0'结束
有'\0'结束标识的字符数组也称为字符串,系统提供了许多的一些字符串的函数
size_tstrlen(constchar*):计算字符串长度,是字符串的有效长度,不算'\0′
charstr[]="iPhone"; unsignedlonglength=strlen(str);//strlen表示有效长度 printf("length=%lu\n",length);
输出结果为:
length=6
strlen()的实现原理:就是遍历字符串,当遇到‘\0′的时候就结束。
char*strcpy(char*,constchar*):字符串拷贝
charstr1[]="Unity"; charstr2[]="Android....."; printf("%s\n",strcpy(str1,str2));
输出结果:
Android
char*strcat(char*,constchar*):字符串拼接
charstr1[]="Unity"; charstr2[]="iPhone"; printf("%s\n",strcat(str1,str2));
输出结果:
UnityiPhone
intstrcmp(constcharstr1*,constcharstr2*):字符串比较,并且根据str1按照字典顺序小于、等于或大于str2的结果分别返回负整数、0或正整数。该返回值是str1和str2由前向后逐字符比较时遇到的第一个不相等字符处的字符的差值
charstr1[]="Unity"; charstr2[]="iPhone"; printf("%d\n",strcmp(str1,str2));
输出结果:
-20指针访问数组
如果pa指向数组中的某个元素,那么pa+1将指向下一个元素,pa+i指向下i个元素。所以,若果pa指向a[0],那么*pa其实就是a[0],*(pa+1)就是a[1],*(pa+i)就是a[i]。根据这个思路,我们可以使用指针来访问数组。
#include<stdio.h> intmain(intargc,char*argv[]) { intscore[10]={76,85,90,67,59,79,82,95,91,65}; intwait,length,i; length=sizeof(score)/sizeof(score[0]); for(i=0;i<length;i++) { printf("%d\n",*(score+i)); } scanf("%d",&wait); }
程序输出:
76 85 90 67 59 79 82 95 91 65
数组下标与指针关系很密切。执行语句pa=&a[0]后,pa和a就具有相同的值了,并且*pa=a[0]。实际上C语言在计算数组下标时也是使用指针来完成的。下标与指针其实是等价的。
当把一个数组名传递给一个函数的时候,实际上传递的是该数组的第一个元素的地址。所以,数组名参数必须是一个指针。
计算字符串长度的程序可以写成以下:
intstrlen(char*s) { intn; for(n=0;*s!='\0';s++) n++; returnn; }
s是指针,也就是一个变量,对它进行自增是合法的。