C基础学习笔记

……接上文

数组

概念具有一定顺序若干变量集合

定义存储类型 数据类型 数组名字[元素个数]

int arr[7];// 定义一个存放7数据整型数组

数组名 arr表的数组地址是一个常量不能赋值不能为左值)

数组中每一个数据称为元素 每个元素都是一个变量

赋值

  1. 全部初始化

int arr[3]={1,2,3};//表示定义三个字符的arr数组赋值123

  1. 部分赋值没有被赋值的地方值为0)

int arr[3]={1,2};//表示定义三个字符的arr数组赋值120

int arr[3]={1,2};//表示定义三个字符的arr数组赋值1,0,0

  1. 初始 数组中元素为随机值)

int arr[3];//表示定义三个字符的arr数组不赋值

后期赋值下标(0--数组长度-1)

语法数组名[下标]=值;

arr[0]=2; //arr数组第一个赋值2其余位置随机

  1. 定义空数组//数组元素0

int arr[3]={0,0,0};

int arr[3]={0};

int arr[3]={};

访问

语法数组名[下标];

例:int arr[3]={1,2,3}

访问第一个元素arr[0]

访问最后一个元素arr[2]

越界

访问下标超过数组范围访问下标最大等于数组长度-1

int arr[3]={1,2,3}

访问arr[3]; //数组越界

注意

  1. 一个数组内数据类型相同
  2. 内存连续

int数组 每个字符4字节

3.数组首地址定义数组名称符合标识符规范

4.同一个函数数组名不能变量重名

int a[3];

int a=10; 错误

5.数组下标0开始n-1结束 注意数组越界

数组分类

一维数组        二维数组

一维数组

只有一个下标

引用
  1. 先定义引用
  2. 每次引用元素只能引用一个 a[0]√   a[0,1,2]×   如果想要所有元素需要遍历
  3. 防止数组越界
  4. 引用数组地址打印格式使用%p
  5. 内存分配

int arr[4];

数组遍历

int arr[3];

arr[0]    arr[1]     arr[2]

for循环完成
#include <stdio.h>
#include <unistd.h>
int main()
{
    int arr[5];
    for (int i = 0; i < 5; i++)
    {
        scanf("%d", &arr[i]);//输入遍历
    }
    for (int i = 0; i < 5; i++)
    {
        printf("%d ", arr[i]); // 输出遍历
    }
    return 0;
}
数组大小

方法

1.sizeof

2.数组中元素个数*数据类型大小

元素个数

int arr[5];

  1. 直接观察
  2. sizeof(arr)/sizeof(int)       //sizeof(数组名)/sizeof(数据类型)

注意数组后面[]可以个数的话必须赋值

清零函数

数组进行

  1. bzero

#include <strings.h>

void bzero(void *s, size_t n);

功能将内存空间数据设置0

参数参数1要清空空间首地址

参数2字节大小

返回值

#include <stdio.h>
#include <strings.h>

int main()
{
    int arr[15] = {1, 1, 12, 24, 6, 8, 3467, 0}; // 开辟5个元素的空间
    bzero(arr, sizeof(arr));
    for (int i = 0; i < 15; i++)
    {
        printf("%d ", arr[i]);
    }

    return 0;
}
  1. memset

#include <string.h>

void *memset(void *s, int c, size_t n);

功能:将内存空间中的数据设置为0

参数:参数1:要清空的空间首地址

参数2:要设置的值 设置为0或-1 //因为此函数针对char类型数据进行设置只修改1字节所以其他整型值无法实现

参数3:字节大小

返回值:要清空的空间首地址

字符数组

概念数组保存的都是字符数据

形式

1.逐个字符赋值

char str[]={'a','b','c'};//定义一个char类型数组开辟三个字节空间

  1. 赋值字符串

char str[7]={"hello"};//开辟了7个字节的空间,赋值5字符但作为字符串系统自动添加\0',实际存放6字符

char str[]="hello";//开辟6字符空间

注意!定义字符数组往往不填写元素个数小心越界问题

字符数组遍历

1.for循环遍历

2.printf   scanf   %s

3. 函数:gets 使用时会报警告,因为此函数不关系数组越界问题,所以用时要自己注意 不要担心)

输入字符串

char *gets(char *s);

功能终端输入一个字符串

参数字符数组首地址要保存数据的位置)

返回值字符数组首地址

puts

int puts(const char *s);

功能终端输出字符串

参数要输出字符串的首地址

返回值输出字符个数

计算字符数组实际长度:不包含\0)

1.for 循环

2.strlen

#include <string.h>

size_t strlen(const char *s);

功能计算字符数组实际长度(不包含\0)

参数字符串首地址

返回值计算字符数组实际长度字符的个数)

sizeof 和 strlen的区别:
  1. 功能不同sizeof计算字节大小 strlen字符串的实际长度
  2. sizeof关键字 strlen函数
  3. sizeof计算结果包含\0strlen不包含\0

定义[]元素个数sizeof会比strlen一个

数组的排序:

int a[5]={5,4,3,2,1};

冒泡排序:

思想数组中相邻两个数进行比较两两比较前者后者交换位置

特点

1.第一轮结束最大最后面

int j=0第一轮: int i=0 比较了4次 5-1-j

54进行比较5>4--->4 5 3 2 1

53进行比较5>3--->4 3 5 2 1

5和2进行比较5>2--->4 3 2 5 1

5和1进行比较5>1--->4 3 2 1 5

int j=1第二轮: 比较3 5-1-j

4和3进行比较:4>3--->3 4 2 1 5

4和2进行比较4>2--->3 2 4 1 5

4和1进行比较4>1--->3 2 1 4 5

int j=2第三轮: 比较了2次 5-1-j

3和2进行比较:3>2--->2 3 1 4 5

3和1进行比较:3>1--->2 1 3 4 5

int j=3第四轮: 比较了1次 5-4=5-1-j

2和1进行比较:2>1--->1 2 3 4 5

#include <stdio.h>
int main()
{
    int a[5] = {5, 4, 3, 2, 1};
    int temp;
    /
    for (int j = 0; j <5-1; j++)
    {
        for (int i = 0; i < 5-1-j; i++)
        {
            if (a[i] > a[i + 1])
            {
                temp = a[i];
                a[i] = a[i + 1];
                a[i + 1] = temp;
            }
        }
    }
    for (int i = 0; i < 5; i++)
    printf("%d  ",a[i]);
    return 0;
}

选择排序

int a[5]={5,4,3,2,1}; // 2 3 1 4 5

思想数组找最小值标记最小值下标第一个进行交换最小值前面

#include <stdio.h>
int main()
{
    int a[5] = {0, 4, 3, 2, 1}; // 1 4 3 2 5
    int temp;
    int k; // 用于标记最小值下标
    for (int i = 0; i < 5-1; i++)
    {
        k = i; // 0 k=1 k=2  3
        for (int j = i + 1; j < 5; j++)
        {
            if (a[k] > a[j])
            {
                k = j;
            }
        }
        if (k != i)
        {
            temp = a[k];
            a[k] = a[i]; // a[1]  2
            a[i] = temp; // a[1]  2
        }
    }
    for (int i = 0; i < 5; i++)
        printf("%d  ", a[i]);

    return 0;
}

排序过程:

(1)首先通过n-1次比较,从n个数中找出最小的, 将它与第一个数交换—第一趟

选择排序,结果最小的数被安置在第一个元素位置上

(2)再通过n-2次比较,从剩余的n-1个数中找出关键字次小的记录,将它与第二

个数交换—第二趟选择排序

(3)重复上述过程,共经过n-1趟排序后,排序结束

int a[5]={5,4,3,2,1};

首先定义一个k用来保存最小值下标

第一轮

0赋值k判断5>4-------> 1赋值k

判断4>3-------> 2赋值k

判断3>2-------> 3赋值k

判断2>1-------> 4赋值k

a[0]a[k]进行交换得到14325

1赋值k判断4>3-------> 2赋值k

判断3>2-------> 3赋值k

判断5>2-------> k不变

a[1]a[k]进行交换得到12345

2赋值k判断4>3-------> k不变;

判断5>3-------> k不变

k保持不变第三轮不做交换得:12345

3赋值k判断5>4-------> k不变;

k保持不变第三轮不做交换得:12345

二维数组

有两个[]

格式存储类型 数据类型 数组名{行数}{列数}

int arr[2][3];//定义了一个两行三列数组

访问元素数组名[行下标][列下标]

arr[0][0]:访问第一行第一列下标

行下标和列下标都是从0开始

访问23元素arr[行数-1][列数-1]

数组的元素的个数:行数*列数

数组的大小sizeof 大小=行数*列数*数据类型的大小

数组名:arr数组第一行首地址 arr+1:数组第二行首地址

arr[0]:第一行第一列地址

初始化
  1. 全部初始化

int arr[2][3]={1,2,3,4,5,6};//按照顺序赋值

int arr[2][3]={{1,2,3},{4,5,6}}; //赋值

  1. 部分初始化

int arr[2][3]={1,2};//按照顺序赋值 12,0,0,0,0

int arr[2][3]={{1},{4,5}}; //赋值100450

  1. 初始化

int arr[2][3];//随机值后续需要赋值只能下标一个一个赋值

注意
  1. 定义二维数组可以省略行数但是不能省略列数

int a[][3]={1,2,3,4,5,6};//数组

int a[2][3]错误

  1. 内存分配

int a[2][3];

获取第一行第二个元素地址&a[0][1]

  1. 注意数组越界行下标和列下标都不能越界)
遍历

双重for循环

                                                                                                                             ……未完待续

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值