C语言day06(数组、字符数组)

C语言day06

【1】数组

1概念:

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

2定义格式:

存储类型 数据类型 数组名[元素的个数]

例:

int arr[5];        //定义了一个数组arr在内存空间中开辟了5个空间来储值

在数组保存每一条数据都叫(元素)变量

数组名:代表数组的首地址(地址常量);数组名不能被重新赋值,不能为左值(等号左边的值)

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

3数组的访问:

数组名[下标]

arr[0];      //1
arr[2];      //3
arr[4];      //5

访问第n元素就是arr[n-1];

4》修改数组内元素

数组名[] =

arr[3] = 100    //100赋值arr[3]

5》数组越界

定义时数组越界:

int arr[3] = {1,2,3,4};       //4就是定义数组越界

定义时只开辟了3个空间但是定义初始值4属于数组越界

访问时数组越界:

int arr[3] = {1,2,3};
printf("%d",a[3]);         //a[3]就是访问时数组越界

定义时开辟了3个空间初始化但是访问时访问到了开辟的3空间外空间属于数组越界

注意:

(1)数据类型相同---定义int 类型数组数组中每一个元素都是int类型

(2)内存连续

(3)数组名[]---变量名 数组内元素-----变量的

(4)数组名的命名要符合标识符命名规范

(5)在同一个函数中变量名数组名不能同名

int a[3];
int a;       //定义一个变量a数组a,同名会产生错误

(6)数组的下标从零开始最后一个元素下标n-1

(7)数组名地址常量

6》初始化

(1)全部初始化

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

(2)未初始化

int a[3];     //未初始化就是随机值,后续赋值只能挨个元素进行赋值
a[0] = 1;
a[1] = 2;
a[2] = 3;

(3)部分初始化

int a[5] = {1,2};   //这样定义前两个被初始化1,2  剩下没初始化自动赋值初始化0

定义空数组

  1. int a[3]={0,0,0};
  2. int a[3]={0};
  3. int a[3]={};

7》引用

(1)先定义后引用

(2)每一次访问只能访问一个值a[i],如果想引用数组中所有的元素可以选择遍历(使用循环)

(3)引用时防止数组越界但是编译器有时候不会报错但是会报警告

(4)对于数组每一个元素地址打印使用%p格式

(5)内存分配

8》数组的遍历

输入元素保存到数组输出数组中的元素

练习:

数组内元素进行求和

9》数组的大小

int a[3]; //开辟12字节空间

(1)数据类型大小 * 元素的个数

(2)sizeof(数组名)

计算元素个数:

sizeof(数组名) / sizeof(数组数据类型)

练习:

计算斐波那契数列前15项并逆序输出

1 1 2 3 5 8 13 21 .....

int a[15];
    int i ;
    a[0] = a[1] = 1;
    printf("%d %d ",a[0],a[1]);
    for(i = 2;i <= 14;i++){
        a[i] = a[i-1] + a[i-2];
        printf("%d ",a[i]);
    }
    printf("\n");
    /*for(i =14;i >= 0;i--){
        printf("%d ",a[i]);
    }*/

    int *p = a;
    int *q = &a[14];
    int t;
    while(p < q){
        t = *p;
        *p = *q;
        *q = t;
        p++;
        q--;
    }
    for(i = 0;i < 14;i++){
        printf("%d ",a[i]);
    }
    printf("\n");

10》清零函数

bzero

需要一个头文件 #include <strings.h>

void bzero(void *s,size_t n);

功能:数组内内存空间设置为0

参数:s:要清空的数组首地址

n 数组的大小(字节)

返回值:

memset

需要一个头文件 #include <string.h>

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

功能:将数组的内存空间设置为某一个值

参数:s要清空数组首地址

c要设置的(只能设置0,设置别的值得不到想要的值)

n数组的大小(字节)

返回值:清空的数组的首地址

【2】字符数组

1》概念

字符数组里面存放都是字符 存放的就是字符串

2》格式

char str[3] = {'a' , 'b' , 'c'};  //逐个字符赋值
char str[] = {'a','b','c'};   //逐个字符赋值    没定义数组的大小则后面赋值多少字符开辟多少空间    数组大小3  元素个数3
char str[] = "hello";    //使用字符串赋值   数组大小6 因为系统自动字符串后面\0
char str[32] = "hello";  //使用字符串赋值    数组大小32

注意使用字符串赋值省略后面的\0 可能产生数组越界所以一般不会定义时写大小

3》字符数组的输入输出

(1)for循环 格式%c

(2)直接使用%s输入输出(空格和回车都是结束的标志)

(3)使用%[^\n]输入输出这个方法不会因为空格和回车而结束直到遇到\n结束

%[^\n]的意思就是   :  除\n以外都是符合格式

练习

在终端输入大写字母小写字母空格数字分别终端输出他们个数

定义字符数组时候要记得初始化char str[20] = {};如果不初始化的话,都是随机值

4》gets输入函数puts输出函数

头文件 #include <stdio.h>

输入:gets

char *gets(char *s)

功能:从终端输入一个字符串

参数:s:字符数组首地址(字符串保存位置)

返回值:字符数组的首地址

注意:不关注数组越界的问题

输出:puts

int puts(const char *s)

功能:向终端输出一个字符串

参数:字符串的首地址

返回值:输出字符个数

5》计算字符串的实际长度

(1)循环

(2)strlen

#include <stdio.h>

size_t strlen(const char *s);

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

参数要计算字符串首地址

返回值字符串的实际个数

6》sizeof和strlen的区别

(1)sizeof计算开辟内存空间大小 strlen 计算字符串长度

(2)sizeof关键字 strlen函数

(3)sizeof 计算计算\0 strlen不会

练习:

实现字符串大小写转换

  • 25
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值