数组
一、一维数组
1、一维数组的简单了解
2、一维数组的创建及初始化
3、一维数组的使用
4、一维数组在内存中的存储
5、指针的初步了解
6、一维数组的指针访问
1、一维数组的简单了解
(1)数组是一组有序数据的集合。
(2)用一个数组名和下标来唯一确定数组中的元素。
(3)数组中的每一个元素都属于同一个数据类型
int main(){
//2、一维数组的创建及初始化
//数组是一组相同类型元素的集合。
//数组的创建方式:类型名 数组名 [常量];
//这里只是在C语言环境中
//数组[]里的常量不能为0,不完全的数组化初始化,缺少的补0;
//数组[]中只能给一个常量才可以,不能使用变量。
//数组的初始化是指,在创建数组的同时给数组的内容一些合理的初始值
int arr[10] = {0};
int arr1[10] = {1,2,3,4,5}; //创建一个容量为10的数组并初始化部分值
int arr2[] = {1,2,3,4,5}; //创建一个数组 char arr3[10] = "abc"; //该数组是以'/0'为标志结束的,末尾有'/0'
char arr4[10] = {'a','b','c'};//该数组没有一'/0'为结束的标志
//3、一维数组的使用
int i = 0; int sz = sizeof(arr1)/sizeof(arr1[0]); //计算数组的大小
for (i=0;i<sz;i++)
{
printf("%d ",arr1[i]);
//输出数组中的每个元素:1234500000 arr中只初始化了5个值,其余的会补0
}
printf("\n");
//4、一维数组在内存中的存储
for (i=0;i<sz;i++ )
{
//打印每一个元素的地址,通过观察,我们会发现随着数组下标的增长,元素地址也在有规律的递增。
//(1)当数组类型为int时,地址增量为4个字节
//(2)当数组类型为char时,地址增量为一个字节
//结论:数组在内存中是连续存放的。
printf("&arr[%d]=%p\n",i,&arr[i]); }
//5、指针的初步了解
//(1)内存中的每一个内存单元(字节)对应一个地址
//(2)在32位平台上指针大小为4个字节,64位平台上为8个字节
//(3)指针可以理解为一个变量,用来存放地址的一个变量
//指针的定义//
int *ptr = NULL;
/*char *ptr = NULL;*/
//6、一维数组的指针访问
//数组名是首元素的地址
printf("%p\n",arr);
printf("%p\n",*arr);
//数组名+整数的运算得到数组的每个元素的地址
for (i=0;i<sz;i++)
{
printf("&arr[%d] = %p\n",i,&arr[i]);
printf("%p\n",arr+i);
}
return 0;
}
在这一章中有两个十分重要的例子,需要我们掌握,并且灵活运用。
<1>用数组求Fibonacci数列问题
#include<stdio.h>
int main()
{
int i;
int f[20]={1,1}; //对前边两个数赋值
for(i=2;i<20;i++)
f[i]=f[i-2]+f[i-1];
for(i=0;i<20;i++)
{
If(i%5==0)printf(“\n”); //控制每输出5个数后换行
printf(“%12d”,f[i]);
}
return 0;
}
<2>另一个就是冒泡排序“”
#include<stdio.h>
int main()
{
int a[10];
int i,j,t;
printf(“请输入10个数”);
for(i=0;i<10;i++)
{
scanf(“%d”,&a[i];
}
for(j=0;j<9;j++) //进行9次循环,实现9次比较
for(i=0;i<9-j;i++) //在每一趟中实现9-j次比较
if(a[i]>a[i+1] //相邻两个数比较
{
t=a[i];
a[i]=a[i+1];
a[i+1]=t;
}
for(i=0;i<10;i++) //遍历输出
printf(“%d”,a[i]);
return 0;
}
二维数组
二维数组与一维数组类似我们可以将其想象成在空间是多行多列的
●创建
int arr1[3][4];//三行四列
double arr2[5][5];//五行五列
●初始化
同样二维数组的初始化也分为完全初始化和不完全两种,一维数组初始化和创建同时进行时int arr[] = {1,2,3};可以省略数组大小部分,通过后面初始化的元素个数来确定其大小,采用此种方法创建+初始化数组,就必须保证数组的行列常量和初始化后面的信息加起来能唯一确定数组形式,如int arr[][3] = {{1,3},{2,4}}; 虽没有给出行数,但根据后面的初始化内容可以确定有两行,所以该数组是两行三列。
字符数组
在字符数组中有几个重要的函数,如下所示:
#include <stdio.h>
/*计算长度*/
int strlen(char s[]);
/*字符串拷贝*/
void strcpy(char b[], char a[]);
/*字符串拼接*/
void strcat(char b[], char a[]);
/*字符串比较大小*/
int strcmp(char b[], char a[]);
/*主函数*/
int main() {
/*测试strlen*/
// printf("%d \n", strlen("sss"));
/*测试strcpy*/
char a[10] = "Hello";
char b[10] = "Hello wor";
strcpy(b, a);
printf("%s \n", b);
/*测试strcat*/
// char a[10] = "World!";
// char b[20] = "Hello ";
// strcat(b, a);
// printf("%s", b);
/*测试strcmp*/
// char a[10] = "Hello";
// char b[10] = "Hello";
// printf("%d", strcmp(b, a));
return 0;
}
//实现计算长度函数
int strlen(char s[]) {
int num = 0;
while(s[num] != '\0') {
num++;
}
return num;
}
//实现字符串拷贝函数
void strcpy(char b[], char a[]) {
int i;
for(i = 0; a[i] != '\0'; i++) {
b[i] = a[i];
}
b[i] = '\0'; //最后补一个\0 作为字符串结尾
}
//实现字符串拼接函数
void strcat(char b[], char a[]) {
int num = 0;
//遍历 b字符串用 num 记录\0位置
while(b[num] != '\0') {
num++;
}
for(int i = 0; a[i] != '\0'; i++) {
b[num] = a[i];
num++;
}
b[num] = '\0';//最后补一个\0 作为字符串结尾
}
//实现字符串比较大小函数
//规则:将两个字符串自左向右逐个字符比较(按ASCII码值大小比较),直到出现不同字符或遇到’\0’为止。
int strcmp(char b[], char a[]) {
for(int i = 0; (b[i] != '\0' || a[i] != '\0'); i++) {
if(b[i] == a[i]) {
continue;
} else if(b[i] > a[i]) {
return 1;
} else if(b[i] < a[i]) {
return -1;
}
}
//循环结束都没有return, 说明两字符串相同 , return 0;
return 0;
}
总结
有关数组的操作有以下几种
1.sizeof(数组名)-数组名相当于整个数组sizeof(数组名)计算的是整个数组的大小,单位是字节.
2.&数组名,取出的是数组的地址除此之外的所有数组名都是首元素的地址
3.数组在函数传参过程中传的是首元素的地址