3. 数组简述

前言:地址的概念

1》地址 -- &

int a;

scanf(“%d”,&a);

2》我想知道 a 到底放在哪个地址中,想把地址打印出来

地址对应的格式控制符:%p

#include <stdio.h>
int main()
{
    int a=10;
    scanf(“%d”,&a);
    printf(“%d”,a);//打印的是 a 的值
    printf(“%p”,&a);//打印的是 a 的地址
    return 0;
}

2、sizeof ---求数据类型大小的关键字,求数据类型大小,单位字节

sizeof(数据类型);

sizeof(变量名);不是函数,是运算符

一、数组

1.1 数组的概念

        数组是相同数据类型的集合

1.2 数组的特点:

        1》存放相同类型的若干个元素(数组中存放的数据,叫做元素)

        2》数组名是数组的首地址,也是数组首元素地址  (在用scanf输入时,后边只用写数组名,不用加&)

        3》数组中各元素地址空间连续

类型表达:数据类型 变量名[长度];          (数据类型:基本数据类型 char int float double等

长度:数组中存放元素的个数,必须是常量

数组的大小=元素数据类型大小*长度;      长度=元素个数 = 数组的大小/元素数据类型大小

例:int a[10];

数组的数据类型:int [10];      (去掉变量名,剩下的就是数据类型)
数组的变量名:a
元素的数据类型:int
数组的大小:4*10

 

1.3 数组的使用:

数组取成员:索引法 

1.4 数组的初始化 

① 完全初始化:int num[6] = {1,2,3,4,5,6};

② 部分初始化int num[6] = {1,2,3};    //依次赋值,没有初始化的元素,系统给0

                          常见:int num[6] = {0};  //第一个是我赋值给的0,剩下的是系统给0

③ 不初始化:int num[6];  全局变量:系统给0;

                                         局部变量:系统给随机数;

注意:数组除了定义的时候,可以整体赋值,其他时候必须要取元素赋值。

④ 省略数组长度 -- 遵循完全初始化

        int num[] = {0,1,2,3,8,9,2};

        for(i=0;i<sizeof(num)/sizeof(num[0]);i++)

1.5 数组的简单应用:冒泡排序

方法:从第一个数开始,与他后面的数作比较,较小的往后排,较小者再与后边的作比较

int num[6] = {1,3,2,6,7,8};

1 3 2 6 7 8

3 1 2 6 7 8

3 2 1 6 7 8

3 2 6 1 7 8

3 2 6 7 1 8  第一轮,6个数,比较5次

3 2 6 7 8 1

3 2 6 7 8 1

3 6 2 7 8 1

3 6 7 2 8 1 第二轮,比较4次

3 6 7 8 2 1

6 3 7 8 2 1

6 7 3 8 2 1 第三轮,比较3次

6 7 8 3 2 1

7 6 8 3 2 1 第四轮,比较2次

7 8 6 3 2 1 第五轮,比较1次

8 7 6 3 2 1

有n个数比较:比较 n-1 轮,第 i 轮,比较:n-i 次

循环嵌套:外层循环控制次数,内层循环取元素依次比较。

二、字符数组

2.1 字符数组初始化

char buf[20];  //基本方法和上面的一维数组没有任何区别,但是,有一些特殊用法,如下:

部分初始化:char buf[20] = {‘h’,’e’,’l’,’l’,’o’};    //部分初始化,没赋值的部分,系统给0(数值0或者’\0’)

定义一个字符数组:char buf[20] = {"hello"};   等价于   char buf[20] = {'h','e','l','l','o','\0'};

char str1[]={‘h’,’e’,’l’,’l’,’0’};     sizeof(str1) = 5;

char str2[] = {“hello”};     sizeof(str2) = 6;               “hello” == ‘h’,’e’,’l’,’l’,’0’,’\0’

%s -- 字符串

char buf[20];

输出:遇到 ‘\0’ 停止输出

输入:scanf(“%s”,buf);

对于scanf来说,空格和回车表示输入完成;要想输入空格,要引入gets函数;

2.2 gets()   puts()  getchar()   putchar()

1》gets():

函数用法:gets(数组名);

函数功能:从键盘获取一个字符串,放在数组中,遇到回车表示输入完成

2》puts():

函数用法:puts(数组名);

函数功能:向屏幕上打印,遇到 ’\0’ 停止打印(会自带一个换行)

补充:单字符相关的两个函数(和数组没有关系)

3》getchar():从键盘获取单个字符

格式:char ch;

ch = getchar();

4》putchar():向屏幕打印一个字符

putchar(变量名);

示例:

printf(“%s”,ch);

字符串的格式控制符 -- %s -- 遇到‘\0’,停止输出

字符串的输入:

        scanf:遇到回车或者空格,就结束

        gets函数:只有遇到回车停止输入!

(puts函数:输出到屏幕上)

怎样学习一个函数:

man 1 :指令  man 1 ls;

man 2:系统相关的函数

man 3:C语言标标准库函数

三、和字符串相关的函数

1》求字符串中字符个数 -- strlen

头文件:#include <string.h>

函数原型:size_t strlen(数组名);   // size_t 是 int 的别名

函数功能:求字符个数,遇到 \0 停止计算

返回值:字符个数,类型为 int 类型

用法:int len = strlen(数组名);

如:a = strlen(buf);

注意:和sizeof要区分开!!

用法:sizeof求数据类型大小;strlen求字符串长度

char str[50]=”hello world!”;

Int len1 = sizeof(sizeof(str));  //50

Int len2 = strlen(str);          //12

2》字符串拷贝函数  strcpy

函数头文件:#include <string.h>

函数原型: strcpy(数组名1, 数组名2);

函数功能:将数组2中的内容拷贝到数组1中,连同\0一块拷贝,\0之后的不再复制。

使用时需要注意的问题是数组名1的空间一定要大于等于数组名2的所占用的空间。否则,会出现严重的程序问题,重要数据可能被破坏等一系列后果。还有一点,要保证数组名2要有字符串结束标记符('\0'),否则可能会出现越界操作。

3》字符串的拼接  strcat

函数头文件:#include <string.h>

函数原型: strcat(数组名1, 数组名2);

函数功能:将数组2中的内容,连接到数组1 的后边;

strcat()在目的串连接之前,先会对dest进行检索'\0',如果成功检索到'\0',则从dest第一个'\0'的位置开始用src中的第一个字符代替,以此类出,直到拷贝完src中的所有字符,并在dest的最后加上一个结束标记符('\0'),dest没有结束标记符('\0'),则可能会导致一个非常严重的问题,即出现数组溢出(越界访问)的问题,轻则数据出现不稳定,重则程序无法执行,甚至出现一系列系统问题.

4》字符串的比较  strcmp

函数头文件:#include <string.h>

函数原型:int strcmp(const char *s1, const char *s2);

形参:s1--数组名   s2--数组名

返回值:int类型

函数功能:比较是按相应的元素,依次比较(s1-s2)

s1>s2:返回大于0的数

s1<s2:返回小于0的数

s1=s2返回值为0

直到出现不同的字符或遇'\0'为止。

总结:

        printf,scanf,getchar,putchar;gets;puts;--<stdio.h>

        strlen,strcpy,strcat,strcmp; -- <string.h>

五、二维数组

5.1 数组的特点:

  1. 存放相同类型的若干个元素!
  2. 数组名是数组的首地址,也是数组首元素地址(数组名就是一个地址!)
  3. 数组中元素地址空间连续

定义一个二维数组:数据类型 变量名[行长度][列长度]

例:int num[3][4];  //定义了一个3行4列的数组

二维数组num的元素:num[0],num[1],num[2];

只是num[0]仍然是一个数组,元素有:int num[0][0],int num[0][1],int num[0][2],int num[0][3]

同样:num[1]也是一个数组,元素有:int num[1][0],int num[1][1],int num[1][2],int num[1][3]

           num[2]也是一个数组,元素有:int num[2][0],int num[2][1],int num[2][2],int num[2][3]

二维数组的含义:二维数组的本质是一维数组,只是数组元素仍然是一个数组!

5.2 数组初始化

1》完全初始化

        int num[3][4] = {{1,2,3,4},{8,9,4,5},{4,6,7,8}};

        int num[3][4] = {1,2,3,4,8,9,4,5,4,6,7,8};

2》部分初始化

        int num[3][4] = {{1,2},{8,9},{4,6}};

二维数组的输入输出:

3》省略长度初始化 -- 列长度不能省略

int num[][2] = {1,2,3,4,8,9,4,5,4,6,7,8};

字符串数组:(字符串=字符数组)

char buf[3][80];
for(i=0;i<3;i++)
{
    gets(buf[i]);
//scanf(“%s”,buf[i]);
//二维数组的每一个元素是一位数组
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值