一、回顾
在开始今天的学习之前,让我们回顾一个概念,什么概念了,那就是地址。
用具体的事例说明进行讲解:
1->int num=0;//定义一个整形变量,变量名为:num
scanf("%d",&num);
&:取地址符;那这个取取地址符号如何查看地址了?
当选择一个数据类型并定义变量名,计算机会为变量名分配空间,比如定义的 int num整形对应四个字节一个字节是八位也就是说计算机会给num分配32为的空间,那么如何查看其地址空间了?
2->地址对应的格式控制符:%p
解释:%p 打印地址: 打印的是首地址
举个例子:
代码:
#include<stdio.h>
int main()
{
int num=0;
printf("num的地址是:%p\n",&num);
return 0;
}
变量的类型: 去掉变量名, 剩下的所有就是该变量的数据类型。
让我们再回顾一下专门用来求数据类型大小的运算符:sizeof()。
举个例子:
double num = 3.14;
sizeof(double): 8 字节
sizeof(num): 实际求的依旧是 num 的数据类型的大小, 还是 double 的大小,是 8 字节。
二、数组
目的:
批量定义若干个类型相同的元素;
特点:
1》 定义若干个类型相同的元素
2》 数组的元素地址空间连续
3》 数组名是数组的首元素地址, 也是整个数组的首地址;
关于数值的空间连续性举个例说明:
#include<stdio.h>
int main()
{
int num[6]={1,2,3,4,5,6};
printf("num=%p\n",num);
printf("&num=%p\n",&num);
for(int i=0;i<6;i++)
{
printf("&num[%d]:=%p\n",i,&num[i]);
}
return 0;
}
输出结果为:
定义:
数据类型 变量名[元素个数];
数据类型: 元素的数据类型
变量名: 符合标识符命名规则即可
整个数组的数据类型:数据类型 [元素个数]
元素个数: 必须是常量
整个数组的大小=元素的数据类型大小*元素个数;
= sizeof(数据类型 [元素个数]);
=sizeof(变量名);
元素个数=整个数组的大小/元素的大小;
举例:
int num[10];//定义 10 个 int 类型的元素 整型数组;
元素的数据类型: int;
整个数组的数据类型(num 的数据类型): int [10]
整个数组的大小(num 的大小):4*10=40char buf[32]; 字符型数组
元素的数据类型(buf[0]): char
整个数组的数据类型( buf 的数据类型) :char [32]
整个数组的大小: 1*32 = 32;
sizeof( char [32]) == 32
sizeof(buf) : 32double num[6]; 浮点型数组
元素的数据类型: double
整个数组的数据类型( num 的数据类型) :double [6]
整个数组的大小: 6*8 = 48;
sizeof( double [6]) == 48
sizeof(num) : 48
使用:
2.1取元素
格式: 变量名[下标];
下标: 距离首元素的偏移量;
下标的范围: 0 到 数组的元素个数-1
数组的初始化(定义+赋值):
2.1.1、完全初始化,依次赋值。
int num[6] = {11,22,33,44,55,66};
#include <stdio.h>
int main()
{
int num[6]={11,22,33,44,55,66};
int i=0;
for(i=0;i<=5;i++)
{
printf("num[%d]=%d\n",i,num[i]);
}
return 0;
}
运行结果。
2.1.2、部分初始化
部分初始化:, 依次赋值, 剩下的默认赋值为 0
int num[6]={11,22};
#include <stdio.h>
int main()
{
int num[6]={11,22};
int i=0;
for(i=0;i<=5;i++)
{
printf("num[%d]=%d\n",i,num[i]);
}
return 0;
}
运行结果:
2.1.3、省略数组元素个数的初始化: 一定是完全初始化
int num[] = {11, 12, 6, 8, 9, 1, 3, 5, 6, 7, 8, 6, 6};
元素个数=数组大小/元素大小
即元素个数 = sizeof(num)/sizeof(num[0]);
2.2数组的应用:冒泡排序--从大到小
int num[6] = {2,8,6,3,1,7};
2 8 6 3 1 7
8 2 6 3 1 7
8 6 2 3 1 7
8 6 3 2 1 7
8 6 3 2 1 7 第 1 轮, 比较 6-1 次
在这里就展示一轮其他的同理:
代码:
#include <stdio.h>
//冒泡排序
int main()
{
int i,num[6] ={1,2,3,4,5,6};
int j,tmp;
for (i=1;i<6;i++)
{
for(j=0;j<6-i;j++)
{
if(num[j]<num[j+1])
{
tmp = num[j];
num[j]= num[j+1];
num[j+1]= tmp;
}
}
}
for(i=0;i<6;i++)
{
printf("num[%d]=%d\n",i,num[i]);
}
return 0;
}
三、字符型数组定义和使用
char buf[32];//字符型数组
数组名: buf
buf 的数据类型: char [32];
buf[0]的数据类型, 即元素的数据类型:char
sizeof(buf) = 32 字节
sizeof(buf[0]) = 1 字节
①用字符串初始化字符型数组:
字符串: “ hello” - ‘ h’ ,‘ e’ ,‘ l’ ,‘ l’ ,‘ o’ ,‘ \0’
char buf[32] = {“ hello” };
buf[0]=‘ h’ ,buf[1]=‘ e’ ,buf[2]=‘ l’
buf[3]=‘ l’ ,buf[4]=‘ o’ ,buf[5]=‘ \0’
buf[7],,,,,buf[32] = 0
0 -- ‘ \0’
②从键盘输入:
%s -- 字符串的格式控制符
char buf[32] = {0};
scanf(“ %s” ,buf);//%s 后面对应的输入列表是数组名(数组名是一个地址)
%s: 表示从键盘接收一个字符串, 空格和回车表示输入的完成;
//终端: hello
buf[0]=‘ h’ ,buf[1]=‘ e’ ,buf[2]=‘ l’
buf[3]=‘ l’ ,buf[4]=‘ o’ ,buf[5]=‘ \0’
printf(“ %s” ,数组名); %s: 遇到’ \0’ 停止打印
scanf 和%s 结合, 不能接收空格, 引入新的函数 gets:
格式: gets (数组名);//数组名必须对应字符型数组
功能: 从键盘接收一个字符串, 仅仅遇到回车表示获取完成
格式: puts(数组名);
功能: 将数组中的内容, 打印到屏幕上, 遇到’ \0’ 停止打印;
文章最后留一个小题感兴趣的可以试一下,看看如何用数值实现:
1、 按以下规律翻译密码:
将每一个字母变成它后面的字母, 例如, 将 A 变成 B, B 变成 C, …, Z 变
成 A, 非字母字符不变, “ !” 作为电文结束标志。
今天的博文到此为止,依旧分享一张图片。