C语言:数组

C语言:数组,第1张

C语言:数组

数组:
由若干个相同类型 的相关数据项,按顺序存储在一起 ,构成的数组;数组其实是同种类型,有序的数据的集合。
数组名:
用统一的名字命名标识这组数据,这个名字就是数组名。
数组元素:
构成数组的每一个数据项称为数组的元素
格式:
类型 数组名[ 下标 ][ 下标 ]…; 其中:类型是数组元素的基类型,就是每个元素的类型。
数组分类:
常用的一维数组,二维数组
一维数组:
格式:
类型 数组名[ 常数表达式 ]; int a[10];//个元素都是整数
元素是 a[0],a[1], a[2],…a[9]。
**说明:**一维数组元素在内存中的排列顺序是线性排列,就是连续存储。
引用:
C语言规定只能逐个引用数组元素,而不能一次引用整个数组。
引用形式:
数组名 [ 下标 ]
其中数组在引用时其下标必须要落在0到n-1的范围内,不然会出现越界,系统不对越界做检查,需要程序员自己检查。其实一个数组元素就是一个变量名,和变量一样使用。
一维数组初始化:
在定义数组时可以给数组初始化:
可全部初始化
也可以部分初始化

在对全部数组元素进行赋值时,可以不指定数组长度

当数组被说明为静态(static)存储类型或者外部存储类型(在所有函数外部定义)时,则在不显示给出初值的情况下,数组元素将在程序编译阶段自动初始化为0。下图
二维数组:
格式:
类型 数组名[ 常数表达式 ] [ 常数表达式 ]; 下图
元素是按行存储

**引用:**数组名 [ 下标 ][ 下标 ], 下标可为整型也可以是常数表达式,
每个数组元素也是一个变量,可以当变量使用。
如果对全部元素赋初值,则定义数据时对第一维长度可以不指定,但是第二维长度不能不写。
一维数组名作为函数参数:
使用简单变量作函数参数,能由实参向形参传递一个数据。但是使用数组名作为函数参数,属于“地址调用”能从主调函数向被调函数传递数组的首地址,并能由被调函数向主调函数传递多个数据。
传递方式:属于赋地址调用,将实参数组首地址传给虚参,虚参也是一个数组名。
虚参要求:必须是数组名
实参要求:可为凌一个数组名
虚实结合:实参和虚参有相同的首地址,虚参改变整个地址内的内容后,实参内容也在变。
函数传递示意图:
但从传值上面来说,还是单方向传递的,只能从实参传递给虚参,虚参不可以再传给实参。


二维数组名作为函数参数

#include 
 
#define ROW 2   //二维数组的行数
#define COL 2   //二维数组的列数
 
//4个版本的求和函数
//方式一:数组形式
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col);
 
//方式二:指针形式,prArray是一个指向包含COL个int的数组的指针
int TwoDimArraySum2(int (*prArray)[COL], int row, int col);
 
//方式三:指针形式,pr是一个指向int的指针
int TwoDimArraySum3(int *pr, int row, int col);
 
//方式四:变长数组(C99开始支持)
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col]);
 
int main(void)
{
    int twoDimArray[ROW][COL] = {{-2, 5}, {4, 9}};
    int result;
 
    //方式一
    result = TwoDimArraySum1(twoDimArray, ROW, COL);
    printf("Sum1函数结果:%dn", result);
 
    //方式二
    result = TwoDimArraySum2(twoDimArray, ROW, COL);
    printf("Sum2函数结果:%dn", result);
 
    //方式三
    result = TwoDimArraySum3(twoDimArray[0], ROW, COL);
    printf("Sum3函数结果:%dn", result);
 
    //方式四
    result = TwoDimArraySum4(ROW, COL, twoDimArray);
    printf("Sum4函数结果:%dn", result);
 
    return 0;
}
 
int TwoDimArraySum1(int twoDimAr[][COL], int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += twoDimAr[i][j];
            // result += *(*(twoDimAr + i) + j);
        }
    }
    return result;
}
 
int TwoDimArraySum2(int (*prArray)[COL], int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += prArray[i][j];
            // result += *(*(prArray + i) + j);
        }
    }
    return result;
}
 
int TwoDimArraySum3(int *pr, int row, int col)
{
    int i, j;
    int result = 0;
 
    for (i = 0; i < row; i++)
    {
        for (j = 0; j < col; j++)
        {
            //下面两种寻址方式都行
            result += pr[i*col + j];
            // result += *(Pr + i*col + j);
        }
    }
    return result;
}
 
int TwoDimArraySum4(int row, int col, int twoDimAr[row][col])
{
   int i, j;
   int result = 0;
 
   for (int i = 0; i < row; i++)
   {
       for (int j = 0; j < col; j++)
       {
           //下面两种寻址方式都行
           result += twoDimAr[i][j];
           // result += *(*(prArray + i) + j);
       }
   }
   return result;
}

字符数组的定义:
**格式:**char 数组名 [ 常数 ] [ 常数 ]…; 字符数组初始化:



字符数组的引用:
引用字符数组中的一个元素,就是得到一个字符。
C语言中没有字符串数据类型,C语言是将字符串作为字符数组处理。

字符数组和字符串的关系:

字符串输入:



这里scanf遇到空格会将认为是结束。后面的数据就丢失了

字符串输出:
这里字符串的长度是6,不是5 ,还有一个’’,在最后,是系统自动加的,因为这是字符串结束的标志。

字符串处理函数:
下面这些函数都有标准库函数都在里面。



字符串连接函数-------strcat


字符串复制函数--------strcpy()


字符串比较函数------strcmp
注意:这里比较是对应元素比较,一方大于另一方就比较完了,不是按长度比较。

字符串长度函数------strlen
这里和siaeof运算符不一样,这里不计算’’,sixeof计算’’.

字符串小写函数-----strlwr

字符串大写函数-----strupr

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zaji/5713803.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-17
下一篇 2022-12-17

发表评论

登录后才能评论

评论列表(0条)

保存