计算机栈结构,先定义的变量为高地址,后定义的变量为低地址,地址间连续
一维数组:
int,char,float a[10];
数组名a表示内存首地址,是地址常量
a ==&a[0]
a+1 == &a[1]
a是常量不能在等号的左边
int a[5];
a是一级地址,&a是二级地址,表示行指针
&a+1是偏移20个字节
一.初始化:
数组不初始化其元素值为随机数
初值个数不能多于数组长度int a[3]={0,1,2}
只给部分元素赋初值,其他元素为0
赋初值是可不指定数组长度,长度为初值个数
二.数组引用
先定义后引用
最大下标小于个数
不可越界:
数组越界危害:
短越界,可能更改连续地址后面变量的值
长越界,可能更改不可动区域的值造成段错误
越界:
int i=0;
int a[5];
for(i=0;i<=5;i++)
a[i]=I;
由于地址是连续的,a[5]的地址是i的地址,所以会改变i的值
排序方法:
冒泡排序,选择排序,插值排序,二分查找
二维数组定义:
int a[3] [4] --> 行 列
一.初始化
直接赋值,一行的所有值可以加大括号也可以不加
二维数组的行可以缺省,列不可以
部分赋值的其余值为0
一级地址:其地址内存放的数据
二级地址:其地址内存放的是一级地址
二维数组中
a是一个行指针,是一个二级地址,a代表第一行整体一行的地址,a+1是偏移一行
a[0]是列指针,是一级地址,表示的是本行头元素,a[0]+1是表示下一个元素的地址
a[2][1]的地址表示 &a[2][1] a[2]+1 *(a+2)+1 *(a+n)==a[n]
字符数组
一.初始化
逐个字符赋值 char ch[3]-={‘b’,‘o’,‘y’};
用字符串常量char ch[4]=“boy”,占用四个字节,还有’\0’,字符串长度为3
字符串结束标志’\0’
二.输出字符串
char buf1[10]=“12345678”;
printf("%.4s\n",buf1)输出前四位
printf("%.3s\n",buf1+3)输出456
int buf2[10];
scanf("%3s",buf2);只提取输入的前三位
gets("%s\n",buf3)输入字符串,可以包括空格,输入的字符串后边自动加’\0’
puts(字符数组) 向显示器输出字符串,结束后再输出一个换行
二维字符数组:
输出格式:
for(i=0;i<5;i++)
{
printf("%s\n",buf[i]) 按行输出
}
字符串处理函数:
strcat:连接两个字符串
strcat(buf1,buf2) 直接合并
注意:
strcpy:字符串拷贝
strcpy(buf1,buf2)将后面的复制到前面
strcmp:比较两个字符串,返回int类型
strcmp(buf1,buf2) buf1>buf2,返回正数 1
< ,返回负数 -1
== ,返回零 0
strlen:计算字符串长度,不包括’\0’
strncpy(buf,“123456”,4)只拷贝后面字符串的前四个字节到第一个字符串,不拷贝’\0’,遇到’\0’结束拷贝
printf("%s\n",buf) --> 1234
strncmp(buf1,buf2,3) --> 只比较前面三个字节
strncasecmp(buf1,buf2,3) --> 只比较前面三个字节,且不区分大小写
strncat(buf1,buf2,3) --> 只连接后面字符串的前三位
sscanf(buf,"%s %s",src1,src2)
memaet(buf,0,sizeof(buf)) 数组全部清零
memcmp(a,b,sizeof(a)),比较数组是否一样,返回int值,一样结果为0,以字节比较
memcpy(b,a,sizeof(a))内存拷贝
sprintf(buf,“字符串”)将输出的字符串输出到buf
char buf[]=“1111 2222”
char scr1,scr2;
sscanf(buf,"%s%s",scr1,scr2)//1111给src1 2222给src2
char buf[]=“1111=2222”
char scr1,scr2;
sscanf(buf,"%[^=]=%s",scr1,scr2)//1111给src1 2222给src2 //[^=]是遇到等号停止,也可以是其他符号