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;
}
一维数组练习
  1. 一维数组中的最值问题:
#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;
}
  1. 一维数组的逆置
#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;
}
  1. 冒泡排序法
#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();

猜你喜欢

转载自blog.csdn.net/weixin_50918736/article/details/130463861