C 基础语法2 —— 数组

1. 一维数组

  • 数组名称可以作为数组的首地址使用,a = &a[0]。a可以直接赋值给指针变量,如 int* p = a(或写成 p = &a[0]),即把数组a[10]的首地址赋给p
#include<stdio.h>

// 打印数组里每一个元素,数组传递时,元素个数传递不过去
void print(int b[],int len)// 这里只传递了数组起始地址,不知道数组有多长
{
    int i;
    for (i = 0; i < len; i++)
    {
        printf("a[%d] = %d\n", i, b[i]);
    }
    b[4] = 20;// 在子函数中修改数组元素
}

int main()
{
    // 定义数组就是写一个变量,后面加一个方括号,方括号里写上整型变量
    // 定义数组的一瞬间,数组占据的空间就确定下来了。
    // 看任何变量的内存,都是将该变量取地址,拖入内存窗口来看
    int a[10] = { 1,2,3,4,5 };
    // a[10] = 1;// 访问越界,访问了不属于自己的空间
    print(a, 5);
    printf("a[4] = %d\n", a[4]);
}

在这里插入图片描述

2. 字符数组(字符串)

  • %c 是输入单个字符,%s是输入一个字符串到字符数组里
  • %c可以识别空格和换行符并将其输入,%s通过空格或换行识别一个字符串的结束
  • 字符数组(字符串)名称本身就代表这个数组的第一个元素的地址,所以在scanf中不需要加取地址运算符
  • 字符数组是由若干个char类型的元素组成,所以字符数组的每一位都是char型的字符。数组末尾都会有一个空字符\0,表示存放的字符串的结尾
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

// 初始化字符数组时,一定要让字符数组的大小比看到的字符串的长度多1
int main()
{
    char c[6] = { 'h','e','l','l','o' };// 填5就是错了,因为加了一个\0的位置
    char d[5] = "how";
    printf("%s---%s\n", c, d);// printf的%s,对应后面要写的字符数组名,字符串常量
    char e[20],f[20];
    scanf("%s%s", e, f);// 字符串数组前不用加取地址符&,scanf读取字符串
    printf("%s---%s\n", e, f);
}

3. 字符数组的传递

  • %c可以识别空格和换行符并将其输入,%s通过空格或换行识别一个字符串的结束
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

void print(char d[])// 我们把d称为形参,c称为实参
{
    int i = 0;
    while (d[i] != '\0')// %c格式对应的是单个字符,%s格式对应的是字符串,char a与char a[10]的区别
    {
        printf("%c\n", d[i]);// 字符数组输出某一个元素时,用%c
        i++;
    }
    printf("\n");
    // 修改字符串数组中的字符串的内容,把首字母变成大写
    d[0] = d[0] - 32;
}

int main()
{
    char c[10] = "hello";// 字符串最后有\0,需要占据一个位置
    print(c);// 调用函数print,使d=c
    printf("%s\n", c);
    return 0;
}

在这里插入图片描述

4. gets与puts

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>

int main()
{
    char c[20];// 字符数组的数组名里存的就是字符数组的起始地址,类型是字符指针
    // 不能使用gets的VS,VS2017请使用下面操作
    fgets(c,sizeof(c),stdin);// 与gets(c)是一样的
    // c是一个字符数组,但编译器给c内部存了一个值,c里面值的类型是字符指针。
    gets(c);// gets只能读取字符串,当一次读取一行时,使用gets
    puts(c);// 等价于printf("%s\n",c);
    return 0;
}

5. string函数使用

  • strlen():得到字符数组中第1个\0之前的字符的个数
  • strcmp():返回两个字符串大小的比较结果,比较原则是按字典序,越靠后值越大
  • strcpy():把一个字符串赋值给另一个字符串
  • strcat():把一个字符串接到另一个字符串后面
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
// strlen统计字符串的长度
// strcpy将某个字符串复制到字符数组中
// strcmp用于比较两个字符串的大小
// strcat用于将两个字符串连接在一起
// char* strcpy(char* to,const char* from);有const修饰代表这个地方可以放字符串常量
int main()
{
    char c[20] = "wangdao";
    printf("数组c内字符串的长度=%d\n", strlen(c));// strlen是整型,不算'\0'结果是7
    char d[20];
    // strcpy(d, c);字符数组里就是wangdao
    strcpy(d,"study");// d中放字符串常量study
    puts(d);
    // 下面是看strcmp,两个字符串比较,是比较对应字符串位置的ASCII值
    printf("两个字符串比较后的结果=%d\n", strcmp("hello", "world"));// 返回的是-1
    // 下面是看strcat,拼接字符串,目标数组要能够容纳拼接后的字符串(7+5<20)
    strcat(c, d);
    puts(c);
    return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

NqqGOGO

你的鼓励是我学习的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值