C语言-学习之路-04
- 数组与字符串
- 一维数组
- 一维数组的定义和使用
- 一维数组的初始化
- 数组名
- 一维数组练习
- 二维数组
- 二维数组的定义和使用
- 二维数组的初始化
- 数组名
- 字符数组与字符串
- 字符串的输入输出
- 随机数
- 字符串处理函数
数组与字符串
数组:为了方便处理数据把具有相同类型的若干变量按有序形式组织起来。
数组就是在内存中连续的相同类型的变量空间。同一个数组的所有成员都是相同的数据类型,同时所有成员在内存中的地址也是连续的。
数组属于构造数据类型:
- 一个数组可以分解为多个数组元素;这些数组元素可以是基本数据类型或构造类型。
( int a[20]; struct Stu boy[10]; ) - 按数组元素类型的不同,数组可分为:数值数组、字符数组、指针数组、结构数组等类别。
( int a[10]; char s[10]; char *p[10]; )
一般情况下,数组元素下标的个数也称为维数,根据维数的不同,可将数组分为一维数组、二维数组、三维数组等。通常称二维及以上的数组为多维数组。
一维数组
一维数组的定义和使用
- 数组名字应付哈标识符规定(数字、字母、下划线)。
- 数组名不能与其他变量相同,同一作用域内是唯一的。
- [] 中常量表达式表示数组元素个数。(下标从0开始计算)
- 定义数组时[]内最好用常量,使用数组时[]内可以是常量,也可以是变量。
如下所示:
#include <stdint.h>
int main()
{
int a[5];//定义数组a ,内有5个成员,每个成员都是int型数据
//下标从0开始,a[0]、a[1]、a[2]、...、a[4]
//没有a这个变量,a只是数组名字,但不是变量,它是常量。
a[0] = 0;
a[1] = 1;
a[4] = 4;
int i = 0;
for (i = 0; i < 5; i++)
{
a[i] = i; //for语句下,给数组a赋值。
}
//遍历数组,并输出数组中每个成员的值
for (i = 0; i < 5; i++)
{
printf("%d\n",a[i]);
}
return 0;
}
一维数组的初始化
在定义数组的同时进行赋值,称为初始化。全局数组若不初始化,编译器将其初始化为0.局部数组若不初始化,内容为随机值。
int a[5] = { 1,2,3,4,5 }; //初始化数组,并同时赋值
int a[5] = { 1,2,3 }; //只初始化前三个值,后面的成员默认设置为0
int a[5] = { 0 }; //所有成员都设置为0
int a[] = {1,2,3,4,5}; //初始化时,如果[] 没有填写具体值,成员值必须初始化。
数组名
数组名只是一个地址的常量,代表数组中首元素的地址。
#include <stdint.h>
int main()
{
int a[5] = { 1,2,3,4,5 };
printf("a=%p\n",a);
printf("&a[0]=%p\n",&a);
int n = sizeof(a); // 数组a所占用内存的大小,5个int类型的成员,5*4=20
int n0 = sizeof(a[0]); // 数组a第一个成员的占用内存大小,即第0个元素,int =4
int i = 0;
for (i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d\n",a[i]);
}
return 0;
}
一维数组练习
- 一维数组中的最值问题:
#include <stdint.h>
int main()
{
int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
int i = 0;
int max = a[0];
for (i = 0; i < 10; i++)
{
if (a[i] > max)
{
max = a[i];
}
}
printf("max=%d\n",max);
return 0;
}
- 一维数组的逆置
#include <stdint.h>
int main()
{
int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
int i = 0;
int j = sizeof(a) / sizeof(a[0]) - 1;
while (i < j)
{
int temp = a[i];
a[i] = a[j];
a[j] = temp;
i++;
j--;
}
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d\n", a[i]);
}
return 0;
}
- 冒泡排序法
#include <stdint.h>
int main()
{
int a[10] = { 6,1,8,2,9,3,-4,5 ,4,-2};
int i = 0;
int n = sizeof(a) / sizeof(a[0]) ;
for (i = 0; i < n; i++)
{
for (int j = 0; j < n - i - 1; j++)
{
if (a[j] > a[j+1])
{
int temp = a[j];
a[j] = a[j+1];
a[j+1] = temp;
}
}
}
for (int i = 0; i < sizeof(a) / sizeof(a[0]); i++)
{
printf("%d\n", a[i]);
}
return 0;
}
二维数组
二维数组的定义和使用
二维数组的一般形式:
类型说明符 数组名 [维度1] [维度2] 例:int a[2][3]
从计算机内存的角度上看,其实没有二维数组,本质上还是一维数组。而二维数组其实是将第一行的数据后,再放入第二行的数据,直至全部放入。其内存地址仍然是连续的!
#include <stdint.h>
int main()
{
int a[3][4];
int num = 0;
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
a[i][j] = num++;
}
}
for (int i = 0; i < 3; i++)
{
for (int j = 0; j < 4; j++)
{
printf("%d\n",a[i][j]);
}
}
return 0;
}
二维数组的初始化
#include <stdint.h>
int main()
{
//方式一
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
int a[3][4] =
{
{1,2,3,4},
{5,6,7,8},
{9,10,11,12},
};
//方式二
int a[3][4] = { 1,2,3,4,5,6,7,8,9,10,11,12 };
//方式三
int a[3][4] = { 1,2,3,4,5,6,7, }; //部分赋值初始化,未初始化的,默认为0.
//方式4
int a[3][4] = { 0 };//全部为0
//方式5 //不建议使用!有些编译器会直接报错
int[][4] = { 1,2,3,4,5,6,7,8 }; //如果存在[]为空,定义时必须初始化。
return 0;
}
数组名
数组名是一个地址的常量,代表数组中首元素的地址。
#include <stdint.h>
int main()
{
//二维数组a
//二维数组本质上还是一维数组,int a[3][4] 中有3个一维数组,每个 一维数组又有4个元素。
int a[3][4] = { {1,2,3,4},{5,6,7,8},{9,10,11,12} };
printf("%p\n", a); //数组名 a是数组首元素的地址,二维数组的第0个元素为一维数组
printf("%p\n", a[0]);//第0个一维数组的数组名为a[0]
//使用sizeof计算二维数组所占用的内存空间
printf("sizeof(a) = %d\n",sizeof(a));
printf("sizeof(a[0])=%d\n",sizeof(a[0]));
printf("sizeof(a[0][0]=%d\n",sizeof(a[0][0]));
printf("行数=%d\n", sizeof(a) / sizeof(a[0]));
printf("列数=%d\n", sizeof(a[0]) / sizeof(a[0][0]));
printf("行数*列数=%d\n", sizeof(a) / sizeof(a[0][0]));
return 0;
}
字符数组与字符串
由于C语言中并没有字符串数据类型,但可以通过数组的方式来代替。例如:char a[]
在C语言中,字符串一定是用char数组来常见,但char数组并不一定就是字符串!
数字0(和字符’\0’等价)结尾的char数组就是一个字符串。如果char数组没有以数字0结尾,那么char数组就只是一个字符数组,不是字符串!
不以‘\0’结尾:
以’\0‘结尾:
另外一种方式:
#include <stdint.h>
int main()
{
char c[] = {"hello"};
printf("%s\n", c);
return 0;
}
字符串的输入输出
#include <stdint.h>
int main()
{
char str[100];
printf("请输入字符串:");
scanf_s("%s",str); //默认以空格分隔
printf("字符串:%s",str);
return 0;
}
随机数
获取随机数,首先要添加头文件!
time_t time(time_t * t); //获取当前系统时间
void srand(unsigned int seed); //用来设置rand()产生随机数时的随机种子
int rand(void); //返回一个随机数
#include <stdint.h>
#include <time.h>
#include <stdlib.h>
int main()
{
time_t tm = time(NULL);//获取当前系统时间
srand((unsigned int)tm);//设置随机种子
int t = rand();
printf("t=%d\n", t); //获取随机数
return 0;
}
字符串处理函数
常用的字符串处理函数有:(后续用到再解释)
- gets();
- fgets();
- puts();
- fputs();
- strlen();
- strcpy();
- strncpy();
- strcat();
- strncat();
- strcmp();
- strncmp();
- sprintf();
- sscanf();
- strchr();
- strstr();
- strtok();
- atoi();