第五章 数组

本文详细介绍了C语言中数组的概念,包括一维数组的定义、存储形式、初始化、引用方法以及注意事项。接着讲解了二维数组的创建、元素存储方式、初始化和引用方式。此外,还提到了多维数组的定义。对于字符数组,特别是字符串的处理,包括输入输出方法和常用的字符串函数如puts、gets、strcpy等。内容深入浅出,适合C语言初学者学习。
摘要由CSDN通过智能技术生成

1.一维数组

定义

  • 一般形式
    要使用数组, 必须在程序中先定义数组, 定义一维数组的一般形式为:
    类型符数组名 [常量表达式];
//代码1
int arr1[10];

//代码2
char arr3[10];
float arr4[1];
double arr5[20];
  • 存储形式
    经过上面的定义, 在内存中划出一片连续的存储空间 。
#include <stdio.h>
int main()
{
    int arr[10] = {0};
    int i = 0;
    for(i=0; i<sizeof(arr)/sizeof(arr[0]); ++i)
    {
        printf("&arr[%d] = %p\n", i, &arr[i]);
    }
    return 0;
}//随着数组下标的增长,元素的地址,也在有规律的递增。
  • 注意
    1. 数组名的命名规则和变量名相同, 遵循标识符命名规则。
    2. 在定义数组时, 需要指定数组中元素的个数, 方括号中的常量表达式用来表示元素的个数, 即数组长度。
    3. 常量表达式中可以包括常量和符号常量

C 语言不允许对数组的大小作动态定义

//注意: 如果在被调用的函数( 不包括主函数) 中定义数组, 其长度可以是变量或非常量表达式。
void func (int n)
{
    int a[2*n] //合法, n 的值从实参传来
}

初始化

数组的初始化是指,在创建数组的同时给数组的内容一些合理初始值(初始化)

//1.在定义数组时对全部数组元素陚予初值
int arr1[10] = {1,2,3,4,5,6,7,8,9,10};
//2.可以只给数组中的一部分元素陚值,系统自动给余下的元素赋值为0
int arr2[10] = {1,2,3,4};
//3.使一个数组中全部元素值为 0
int arr3[10] = {0};
//4.在对全部数组元素赋初值时, 由于数据的个数己经确定, 因此可以不指定数组长度。 
int arr4[] = {1,2,3,4};

//字符数组同理
char arr4[3] = {'a',98, 'c'};
char arr5[] = {'a','b','c'};
char arr6[] = "abcdef";

数组在创建的时候如果想不指定数组的确定的大小就得初始化。数组的元素个数根据初始化的内容来确定。

引用

在定义数组并对其中各元素赋值后, 就可以引用数组中的元素。

引用数组元素的表示形式为
数组名[下标]

#include <stdio.h>
int main()
{
    int arr[10] = {0};//数组的不完全初始化
    //计算数组的元素个数
    int sz = sizeof(arr)/sizeof(arr[0]);
    //对数组内容赋值,数组是使用下标来访问的,下标从0开始。所以:
    int i = 0;//做下标
    for(i=0; i<10; i++)//这里写10,好不好?
    {
        arr[i] = i;
    }
    //输出数组的内容
    for(i=0; i<10; ++i)
    {
        printf("%d ", arr[i]);
    }
    return 0;
}

注意:

  1. 数组是使用下标来访问的,下标从0开始。
  2. 数组的大小可以通过计算得到
int arr[10];
int sz = sizeof(arr)/sizeof(arr[0]);

2.二维数组

定义

  • 一般形式
    类型说明符数组名[常景表达式][常量表达式];

二维数组可被看作是一种特殊的一维数组: 它的元素又是一个一维数组。

//数组创建
int arr[3][4];
char arr[3][5];
double arr[2][4];
  • 元素存放方式
#include <stdio.h>
int main()
{
    int arr[3][4];
    int i = 0;
    for(i=0; i<3; i++)
    {
        int j = 0;
        for(j=0; j<4; j++)
        {
            printf("&arr[%d][%d] = %p\n", i, j,&arr[i][j]);
        }
    }
    return 0;
}

内存中的二维数组

在内存中, 各元素是连续存放的, 不是二维的, 是线性的。

初始化

可以用“ 初始化列表” 对二维数组初始化。

//1.分别给二维数组赋初值
int arr[3][4] = {{1,2,3,4},{4,5,6,7},{4,5,6,7}};
//2.可以将所有数据写在一个花括号内, 按数组元素在内存中的排列顺序对各元素赋初值
int arr[3][4]={12,3, 45, 6, 7, 89, 10, 1112}//3.可以对部分元素赋初值。 
int arr[3][4]={{l},{5},{9}}
//4.定义数组时对第 1 维的长度可以不指定, 但第 2 维的长度不能省
int arr[][4] = {{2,3},{4,5}};

引用

二维数组元素的表示形式为:
数组名[下标][下标]

#include <stdio.h>
int main()
{
    int arr[3][4] = {0};
    int i = 0;
    for(i=0; i<3; i++)
    {
        int j = 0;
        for(j=0; j<4; j++)
        {
        arr[i][j] = i*4+j;
        }
    }
    for(i=0; i<3; i++)
    {
        int j = 0;
        for(j=0; j<4; j++)
        {
            printf("%d ", arr[i][j]);
        }
    }
    return 0;
}

3.多维数组

C 语言还允许使用多维数组。 例如, 定义三维数组的方法如下:

float a[2][3][4];

4.字符数组

参考一二维数组学习

常用来组成字符串,用\0作为结束标志

输入输出方法

  • 逐个字符输入输出
    用格式符“% C”输入或输出一个字符。
  • 将整个字符串一次输入或输出
    用“%s”格式符, 意思是对字符串 ( string) 的输入输出。

注意:

  1. 输出的字符中不包括结束符 \0
  2. 使用“%s“格式符输出字符串时, printf 函数中的输出项是字符数组名, 而不是数组元素名。
  3. 如果数组长度大于字符串的实际长度, 也只输出到遇\0结束。
  4. 如果一个字符数组中包含一个以上’\0;则遇第一个’\0’时输出就结束。
  5. 可以用 scanf 函数输入一个字符串。 如果利用一个 scanf 函数输入多个字符串, 则应在输入时以空格分隔。
  6. 用"%s" 格式符输出字符串的方法, 按字符数组名 C 找到其数组起始地址, 然后逐个输出其中的字符,直到遇’\0’为止。

常用字符串函数

puts 函数—输出字符串的函数
  • 一般形式

puts(字符数组)

  • 作用是将一个字符串(以\0结束的字符序列) 输出到终端。

gets 函数—输入字符串的函数

  • 一般形式
    gets(字符数组)
  • 作用是从终端输入一个字符串到字符数组, 并且得到一个函数值。 该函数值是字符数组的起始地址。

puts 和 gets 函数只能输出或输入一个字符串。

strcat 函数—字符串连接函数

  • 一般形式
    strcat(字符数组 1, 字符数组 2)
  • 作用是把两个字符数组中的字符串连接起来, 把字符串 2 接到字符串 1 的后面, 结果放在字符数组 1 中,
    返回值为字符数组 1 的地址。


注意:

  1. 字符数组 1 必须足够大, 以便容纳连接后的新字符串。
  2. 连接前两个字符串的后面都有 \0 ;连接时将字符串 1 后面的\0取消, 只在新串最后保留\0.

strcpy 和 stmcpy 函数- 字符串复制函数

  • 一般形式
    strcpy (字符数组 1 , 字符串 2)
  • 作用是将字符串 2 复制到字符数组 1 中去。

注意:

  1. 字符数组 1 必须定义得足够大, 以便容纳被复制的字符串 2。 字符数组 1 的长度不应小于字符串 2 的长度。
  2. 字符数组 1 必须写成数组名形式( 如 strl ),“ 字符串 2” 可以是字符数组名, 也可以是一个字符串常量。
  3. 如果在复制前未对 strl 数组初始化或赋值, 则 strl 各字节中的内容是无法预知的, 复制时将 str2 中的字符
    串和其后的’\0’一起复制到字符数组 1 中, 取代字符数组 1 中的前面 6 个字符, 最后4个字符并不一定是\0 ,而是 strl 中原有的最后 4 个字节的内容。
  4. 不能用赋值语句将一个字符串常景或字符数组直接赋值给一个字符数组。
  5. stmcpy 函数将字符串 2 中前面 n 个字符复制到字符数组 1 中去。

strcmp 函数-字符串比较函数

  • 一般形式
    strcmp ( 字符串 1, 字符串 2)

  • strcmp 是 STRingCoMPare (字符串比较) 的缩写。 它的作用是比较字符串 1 和字符串 2。

  • 比较规则
    将两个字符串自左至右逐个字符相比( 按 ASCII 码值大小比较), 直到出现不同的字符或遇到\0为止。

    1. 如全部字符相同, 则认为两个字符串相等;
    2. 若出现不相同的字符, 则以第 1 对不相同的字符的比较结果为准。
    3. 如果参加比较的两个字符串都由英文字母组成, 则有一个简单的规律:在英文字典中位置在后面的为大
  • 比较结果

    1. 如果字符串 1=字符串 2, 则函数值为 0;
    2. 如果字符串 1>字符串 2, 则函数值为一个正整数;
    3. 如果字符串 1<字符串 2, 则函数值为一个负整数。

strlen 函数—测字符串长度的函数

  • 一般形式
    strlen (字符数组)

  • strten 是 STRing LENgth (字符串长度) 的缩写。 它是测试字符串长度的函数。

函数的值为字符串中的实际长度(不包括\0在内)。

strlwr 函 数 -转 换 为 小 写 的 函 数

  • 一般形式
    strlwr (字符串)

  • strlwi• 是 STRingLoWeRcase (字符串小写) 的缩写;

函数的作用是将字符串中大写字母换成小写字母。

strupr 函 数 -转 换 为 大 写 的 函 数

  • 一般形式
    strupr (字符串)

  • strupr 是 STRingUPpeRca.se (字符串大写) 的缩写。

函数的作用是将字符串中小写字母换成大写字母。

在使用字符串处理函数时, 应当在程序文件的开头用头文件#include<string.h>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值