数组
概念:数组是一个集合,可以定义对应的变量,(就是可以存放很多数据,里面的数据都是要同一种类型)
整型数组:
初始化:定义+赋值
① int a[5] = {1,2,3,4100,5345};
② int a[5] = {1,3,4};//局部初始化,后面数据为0
③ int a[5] = {0};//清空数组 清空是什么意思:清空为0,空间里面是不可能没东西的。
④ int a[] = {1,2,4};(数组对应的长度,是由编译器自己计算的,大括号里面有多少个就多少个)
//整型数组示例代码:从小到大排序
int data;
for(int m=0; m<3; m++)//
{
for(n = m+1; n<4;n++)
{
if(a[m] > a[n])//条件成立则进行互换
{
data = a[m];
a[m] = a[n];
a[n] = data;
}
}
}
数组注意点:
1)数组越界,编译的时候不会报错,但是运行的时候有可能段错误。所以写过于数组的代码不要越界访问数组元素。
2)数组的下标范围是他的长度-1(动态计算数组的长度 = 数组总大小/数组数据类型的大小)
3)数组中,所有元素的地址都是连续在一起的,如果是整形数组,那么是隔4个字节连在一起的。
4) 数组的地址&array和数组首元素的地址&array[0]和数组的名字array存放的都是同一个地址值
array:数组的名字array可以表示的是数组首元素的地址。
(array除了表示数组首元素的地址之外,也可以表示整个数组)
&array == array == &array[0]
5) 数组内每一个元素都是同一种数据类型
字符数组:
初始化:
1)char array[10] = {‘a’,‘v’,‘s’,‘1’,‘2’,‘4’,’.’};//0就是\0
2)char array[500] = “hi”; hi后面默认为0,也就是\0.
\3) char array[] = “helloworld”;//编译器帮你计算字符串的长度
\4) char array[10] = “\0”;//定义一个空的数组
字符数组注意点:
① 结束标志符号:\0 (占一个字节,属于转义字符)
② 数组名 == &数组名 == &数组名[0]
③ 数组名可以表示数组,也可以表示数组首元素的地址
常用的字符串函数:
计算字符串:strlen:计算给定字符串的长度。
sizeof:返回一个对象或者类型所占的内存字节数。
字符串拷贝:strcpy
字符串比较:strcmp
字符串拼接:strcat
自己写常用的字符串函数:
//计算字符串:strlen
int main()
{
int i=0,n=0;
scanf("%d",&n);
char a[n];
scanf("%s",a);
while(a[i]!='\0')
{
i++;
}
printf("%d\n",i);
return 0;
}
//字符串拼接: strcat
int my_strcat();
int main()
{
char a[5]="abc",b[4]="de";
my_strcat(a,b);
return 0;
}
int my_strcat(char *a,char *b)
{
int i,n,k,lenA=strlen(a),lenB=strlen(b);
// printf("%ld,%d",strlen(a),lenB);
n=lenA+lenB;
char c[n];
for(i=0;i<lenA+1;i++)
{
c[i]=a[i];
if(a[i]=='\0')
{
for(k=0;k<lenB;k++)
{
c[i]=b[k];
i++;
}
}
}
printf("%s\n",c);
printf("%ld\n",strlen(c));
}
//字符串比较:strcmp
int my_strcmp();
int main()
{
char a[5]={'a','b','c','d','e'},b[5]={'a','b','c','d','e'};
// my_strcmp(a,b);
printf("%d",my_strcmp(a,b));
return 0;
}
int my_strcmp(char *a,char *b)
{
int n,i;
for(n=0;n<5;n++)
{
if(a[n]==b[n])
{
i=0;
}
else if(a[n]<b[n])
{
i=1;
break;
}
else
{
i=-1;
break;
}
if(i==0)
{
printf("字符串相等");
break;
}
}
return i;
}
//字符串拷贝:strcpy
int main()
{
char a[10] = "hello";
char b[10];
printf("拷贝之前b里面的数据是%s\n",b);
//另一种方法
//strcpy(b,a);
//int len=strlen(a);
//for(int 1=0;i<len;i++)
//{
// b[i]=a[i];
//}
while(a[i]!='\0')
{
b[i]=a[i];
}
printf("拷贝之后b里面的数据是%s\n",b);
return 0;
}
二维数组:
二维数组:
定义: int array[行][列];
int array[2][3] = {6,7,8,9,10,11};
int array[2][3] = {{1,2},{4,5}};
int array[ ][4] = {1,2,3,4};
1,2,3,4
0 0 0 0
数组名字:array,也可以表示数组首元素的地址&array[0]
数组名字array 等于 数组首元素地址&array[0][0] 等于数组的地址 &array 等于第一个一维数组的地址 &array[0]
二维数组和指针
int array[2][3] = {6,7,8,9,10,11};
array:是数组的名字,也可以表示第一个元素<第一个一维数组>的地址?存放了什么? &(array[0])
&array:是二维数组本身的地址。
*(&(array[0])) 等于 (array[0])
*array:是第一个一维数组也可以表示第一个一维数组中的首元素的地址 &(array[0][0])
(*array)[1]:是第一个一维数组中的第二个元素,存放了什么?7
*((*array)+1):是第一个一维数组中的第二个元素,存放了什么?7