C语言学习笔记之数组

主题:C语言学习笔记之数组
时间:2021年2月13日
作者:ybb

6.1数组的概念和定义

数组是一组相同数据库类型组成的集合,利用数组可以减少变量的数量,从而提高开发的效率。
问题的引入:可以发现在这里需要定义多个数据类型相同的变量。

#include<stdio.h>
#include<stdlib.h>

int main() {
	int a=10, b=11;
	int c=12, d=13;
	printf("%-5d%-5d\n",a,b);
	printf("%5d%5d\n", c, d);
	return 0;
}

scanf与for循环与数组:

#include<stdio.h>
#include<stdlib.h>

int main() {
	int i = 0;
	int a[10];
	for (int i = 0; i < 10; i++)
	{
		scanf_s("%d",&a[i]);
	}
	for (int i = 0; i < 10; i++)
	{
		printf("%d\n",a[i]);
	}
	return 0;
}

注:数组中每个元素的数据类型必须相同;
指明下标,防止因为越界(过大或过小)导致数组溢出。

数组内存是连续的,从而为指针操作(通过指针访问数组元素)和内存处理(整块内存的复制和写入)提供了方便,这使得数组可以作为缓存(临时存储数据的一块内存)使用。
数组是一个整体,他的内存是连续的。也就是说,数组元素之间是相互挨着的,彼此之间没有间隔,知道了首地址也就可以根据连续下标和连续内存访问数组的其他元素,
利用下图理解数组内存是连续的:
在这里插入图片描述
数组可以定义再赋值,也可以在定义数组的同时赋值。

注:
1.只能给数组元素逐个赋值
int a[3]={1,1,1}
不能写作
int a[3]=1
2.给全部元素赋值时,定义数组的时候可以不给出数组长度。

6.2C语言二维数组

二维数组在概念上是二维的,但是在内存中是连续存放的,也就是说,二维数组的各个元素是相互挨着的,彼此之间没有间隔。
在C语言中,二维数组是按行排列的;也就是说,二维数组是由多个长度相同的以为数组构成的。

二维数组的初始化

6.3C语言判断数组中是否包含某个元素

遍历数组
字符串比较

#include<stdio.h>
#include<stdlib.h>

int main() {
	int a[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int num;
	int j = -1;
	printf("input an integer\n");
	scanf_s("%d",&num);
	for (int i = 0; i < 10; i++)
	{
		if (num==a[i])
		{
			j = 1;
			
			break;
		}
		
		
	}
	if (j>0)
	{
		printf("Yes");
	}
	else
	{
		printf("No");
	}
	return 0;
}

6.4C语言字符数组和字符串详解

在C语言中,没有专门的字符串变量,没有string类型,通常就用一个字符数组来存放一个字符串。
字符数组实际上是一系列字符的集合,也就是字符串。
字符数组只有在定义时才能将整个字符串一次性的赋值,一旦定义完成了,就只能一个字符一个字符赋值
正确表达:
char str[]=“hahaha”;
正确表达:
char str[0]=‘h’;
char str[1]=‘a’;
错误表达:
char str[];
str=“hahaha”;

字符串结束标志:
在C语言中,字符串总是以‘\0’作为结尾,所以‘\0’被称为字符串结束符。
关于’\0’ 是ASCII码表的第0个字符,英文成为NULL,中文成为空字符。
被“”包围的字符串会自动的在末尾添加‘\0’
在这里插入图片描述
被’'包围的字符属于逐个赋值并不会添加‘\0’

注:

在函数内部定义的变量、数组、结构体、共用体都称为局部数据,在很多编译器下,局部数据的初始值都是随机的、无意义的,不一定是0值。

注:

字符串用“”
字符用‘’
数字直接用

注:
全局变量:global variable
因为全局变量存储在内存分区中的全局数据区,这个区域中的数据在程序载入内存后会被初始化为0,因此全局变量默认初始值为0
局部变量:local variable
局部变量没有默认的初始值,因此局部变量在使用之前需要手动初始化。
注:为什么变量的定义与初始化一般都在表达式前面?
这样可以让编译器为变量分配内存更加方便

字符串长度:
字符串长度就是字符串中字符的个数,不包括字符串结束符,字符串结束符就是为了识别的。
6.5字符串的输入与输出

输入:
scanf()
gets()
输出:
printf()
puts()

字符串的输入:
scanf()既可以输入字符串也可以输入其他的数据类型
注:scanf()读取字符串时会以空格作为分割,遇到空格就认为当前字符串结束了,所以无法读取含有空格的字符串。
注:int char float 等类型的变量用于scanf()时要加&
数组、字符串用于scanf()时会自动转换为地址因此不用加&
gets()只能用来输入字符串
注:gets()读取字符串遇到回车键才认为是结束,空格在gets是作为字符串的一部分。

注:
C语言规定,只有在定义或声明数组时、sizeof操作、&操作时,表示的是整个数组。在其他表达式中,数组名会被转换成指向第0个元素的指针。

数组下标:
int a={1,2,3,4,5}
int *p
int i

访问a[i]用
p=a
*(p+i)
或者用
p=a+i
*p

注:
下标长度的步长对应数组类型的大小,char 1个字节 int 4个字节

scanf()的高级用法

指定读取长度
匹配特定字符

#include <stdio.h>
int main(){
    char str[30];
    scanf("%[abcd]", str);
    printf("%s\n", str);
    return 0;
}

丢弃读取到的长度
注:使用scanf()清空缓冲区
scanf使用小结:
在这里插入图片描述

6.6C语言字符串处理函数

字符串比较、字符串拷贝、字符串连接
字符串输入、字符串输入
字符串比较strcmp():
字符本身没有大小之分,比较的是各个字符对应的ASCII码值,从第0个字符开始比较,如果相等就继续比较下一个字符直到遇见不相等的或者到达字符串末尾。

#include<stdio.h>
#include<string.h>

int main() {
	char a[] = "ABCD";
	char b[]= "abcd";
	char c[] = "1234";
	char d[] = "ABCD";

	if (!strcmp(a,d))
	{
		printf("equal\n");
	}
	else
	{
		printf("not equal");
	}
	return 0;
}

字符串拷贝:strcpy()
正确范例:

#include<stdio.h>
#include<string.h>

int main() {
#pragma warning(disable:4996)
	char a[10] = "hahaha";
	char c[10] = "nihao";
	strcpy(a, c);
	printf("%s\n",a);
	return 0;
}

错误范例:

#include<stdio.h>
#include<string.h>

int main() {
#pragma warning(disable:4996)
	char a[10] = "hahaha";
	char c[10] = "nihaomezuijin";
	strcpy(a, c);
	printf("%s\n",a);
	return 0;
}

字符串级联strcat():

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>

int main() {

	char A[] = "HAHAHA";
	char B[];
	printf("input a string\n");
	gets(B);
	strcat(A, B);
	puts(A);
	return 0;
}

6.7C语言数组是静态的,不能插入或删除元素

静态数组:在C语言中,数组一旦被定义,占用的内存空间就是固定的,容量不可改变,既不能插入新元素也不能删除旧元素。针对数组的元素只能进行读取和修改。
如果需要插入或者删除该怎么办呢,采用新的数组。
动态数组:被定义之后的数组仍旧可以在任意位置插入或者删除元素。

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

void func(int arr[], int len)
{
	for (int i = 0; i < len; i++)
	{
		printf("%d",arr[i]);
	}
	printf("\n");
}

int main() {
	int arr1[10] = { 1,2,3,4,5,6,7,8,9,10 };
	int arr2[9];
	int arr3[11];

	for (int i = 0; i < 10; i++)
	{
		if (i<6)
		{
			arr2[i] = arr1[i];
		}
		else if (i>6)
		{
			arr2[i - 1] = arr1[i];
		}
	}
	func(arr2, 9);

		for (int i = 0; i < 10; i++)
		{
			if (i<7)
			{
				arr3[i] = arr1[i];
			}
			else if (i==7)

			{
				arr3[7] = 55;
				arr3[i + 1] = arr1[i];
			}
			else  if(i>=7)
			{
				arr3[i + 1] = arr1[i];
			}
		}
	func(arr3, 11);
	return 0;
}

6.8C语言数组的越界和溢出

越界:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
	int arr[3] = {1,2,3};
	for (int i = -1; i < 4; i++)
	{
		printf("%d\n",arr[i]);
	}
	return 0;
}

溢出:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
	char str[6] = "hahaha nihaome";
	puts(str);
	printf("%s",str);
	return 0;
}

6.9C语言变长数组

变长数组:再运行期间分配内存
普通数组:在编译期间分配内存
注:
变长数组仍是静态数组
错误代码:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

int main() {
	int n=10;
	printf("input a length\n");
	scanf_s("%d",&n);
	scanf_s("%*[^\n]"); scanf_s("%*[^c]");

	char str[n];
	printf("input a string\n");
	puts(str);
	return 0;
}

6.10C语言对数组进行排序

#include<stdio.h>
#include<stdio.h>
#include<string.h>

int main() {
	int i, j, temp;
	int n = 10;
	int a[10] = { 5,6,7,1,2,3,4,9,8,10 };

	for (int i = 0; i < n-1; i++)
	{
		for (int j = 0; j < n-1-i; j++)
		{
			if (a[j]>a[j+1])
			{
				temp = a[j];
				a[j] = a[j + 1];
				a[j + 1] = temp;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		printf("%d ",a[i]);
	}
	return 0;
}

6.11C语言数组的总结

排序算法及其优化

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值