c语言基础笔记(4)

目录

一,数组

1,什么是数组?

2,特点

3,数组的声明

4,数组的初始化

5,数组访问

6,数组内存大小计算

7,字符数组和字符串类型

8,多维数组

9,数组和指针

10,字符串数组

二,函数

1,定义及特点

2,声明与定义

3,函数的调用

4,参数值传递

5,指针传递

三,结构

1,定义特点及声明

2,特殊的结构体成员及变量

3,结构指针

4,结构体与函数


一,数组

1,什么是数组?

         (1)数组是C语言一种派生的数据类型,从字面意思看,数组是一组相同类型的数,在计算机内部,会分配连续的内存空间保存这组数,该内存空间的大小根据每种数据类型的大小乘以这组数的个数确定。

           (2)每个变量声明需要我们使用标识符单独声明,当有多个相同类型的数需要保存时,例如1000个int型整数需要保存时,这是不可能声明1000个整型变量保存,可以简单是用 int a[1000]; 整数数组保存;

            *数组是一组有序数据的结合;

            *数组中的每一个元素都属于同一个数据类型;

            *用一个数组名和下标来确定数组中的元素;

2,数组的特点:

        •数组的长度是确定,需要定义数组保存的数的个数
        •数组中每个数称为元素,元素从0开始编号,当数组长度为n,数组编号范围从0到n-1
        •数组的每个元素访问,简单通过下标运算符,a[0] a[1] ... a[n-1]
        •计算机内部分配给数组一块连续的内存空间,内存地址是连续的,从低地址到高地址

注:C89标准不支持变长的数组,C99标准才开始支持变长数组

3,数组的声明

数组和普通类型一样,需要声明定义、初始化

声明语法:

类型  数组名称[数组长度];
•类型:整型、浮点型、指针、结构、联合、枚举等对象类型,不包括void和函数类型。
•数组名称:任意一个合法的标识符即可。
•数组长度:无符号整数,常量表达式,不允许使用变量

例如:以下声明各种类型数组,均声明定义,未初始化。

// 字符数组
char    c[100];

// 整数数组,数组长度100
int     a[100];

// 浮点数数组
float   f[100];
// 双精度浮点数数组     
double  d[100];     

// 声明结构数组变量sa

詹老板想扣篮:
struct s sa[100];

// 声明联合数组变量ua   
union  u ua[100];

// 声明枚举数组变量ea
enum   e ea[100];   

// 声明int型指针数组pa
int *pa[100];

// 声明结构指针数组pa
struct s *pa[100];

// 声明void指针数组pa,合法
void *pa[100];

// 声明指向 返回值和参数值都为void 函数指针的数组pa
void (*pa[100])(void);   

4,数组的初始化
        (1)数组初始化,是指给数组中每个元素内存空间存放初始值。数组长度较大时,一般需要使用循环结构去初始化。

     (2)  数组元素较少的情况下
数组长度很少时,一般少于10个时,直接赋值初始化

       (3)数组元素较多的情况下
数组长度较大,使用循环和下标访问进行初始化。

5,数组访问
数组元素通过数组下标[]运算符访问和修改。

注:数组元素下标是从0开始计数的,当数组长度为n时,下标最大只能访问n-1。

//例如:求数组元素的和。

#include <stdio.h>
int main(void)
{
    int a[5] = {1, 2, 3, 4, 5}, i, sum = 0;
    for (i = 0; i < 5; i++)
        sum += a[i];
    printf("%d\n", sum);
    return 0;
}

6,数组内存大小计算

sizeof(数组名称)可以计算出数组在内存中占据多少字节。

//例如:计算数组a的内存大小。

#include <stdio.h>
int main(void) 
{
 int a[5] = {1,2,3,4,5};
 printf("%lu\n", sizeof(a));
    return 0;
} 

7,字符数组和字符串类型

           *用来存放字符数据的数组是字符数组;

           *c语言字符数组存放字符串,字符数组中的各个元素一次存放字符串的各个字符;

定义格式: char 数组名 [常量表达式];

                 例如 : char c [6]

               (c数组中有六个元素,可以存放长度小于或者等于五的字符串)

         (1)字符数组和字符串数组形式上一样,区别是最后一个元素是否是空字符 '\0'。

例如:

以下是字符数组,保存 hello 五个字符,处理时只能单独访问各个字符,不能作为字符串hello处理。

// 字符数组
char c[5] = {'h','e','l','l','o'};  


以下同样是字符数组,保存hello和\0 六个字符,即可作为字符数组处理,也可以作为字符串处理。

// 字符串
char c[6] = {'h','e','l','l','o','\0'}; 
以下声明和定义字符串的方式,C语言没有单独的字符串类型,字符串会转换等同于上述字符串 c[6],因此数组c的长度是6,最后一个字符会是 '\0'。


// 字符串类型声明和初始化
char c[] = "hello"; 

注:字符数组不等于字符串类型,字符串类型一定是最后一个元素是'\0'的字符数组。

8,多维数组

       *一维数组的定义格式为:

   类型说明符  数组名  [ 常量表达式 ]

    说明:

           *类型说明符  :  数组的类型;

           *数组名命名规则和变量名相同,遵循标识符命名规则;

           *常量表达式可以包括常量和符号常量,但不可以包含变量;

          *常量表达式指明数组中的元素个数,必须大于零;

          *数组名后是用方括号而不是圆括号;

       (1)C语言数组支持多维数组,数组类型进行嵌套,有几维就使用几个方括号[],C语言支持更高维数的数组,一般我们最多使用到三维数组。

一维数组:int a[100];

二维数组:int a[100][100];

三维数组:int a[100][100][100];

        (2)多维数组可以看成多个一维数组组成的,初始化和访问和普通数组一样,数组下标都是从0开始。例如,二维数组可以相当于表格,存放100行100列数据。

         (3)一维数组的引用:c语言规定,只能引用单个数组元素,不能一次引用整个数组;

           说明:

         *下标是指在数组中的第几个元素;

        *下标可以是整型变量 ,整型常量和整型表达式;

        *下标的值是数组元素序号,从0开始,到n-1结束;

        *要注意区分数组定义和数组元素引用;

例如:计算二维数组所有元素的和,从行到列开始访问累加

#include <stdio.h>
int main(void)
{
    int a[2][5] = {{1, 2, 3, 4, 5},
                   {6, 7, 8, 9, 10}};
    // i标记行号
    // j标记列号
    int sum = 0, i, j;
    for (i = 0; i < 2; i++)     
        for (j = 0; j < 5; j++) 
            sum += a[i][j];
    printf("%d\n", sum);
    return 0;
}

9,数组和指针

          (1)数组名称相当于指针常量,因此数组名称可以赋值给对应类型的指针变量,同样指针的特性和运算,可以通过数组名称使用。

            (2)数组和指针区别:

1.sizeof(p)的值是4,因为p是指针类型,sizeof(a)值为20,a是数组类型。

2.数组类型和指针类型仍是两种不同类型,只是有些特性相似。

3.函数参数允许使用数组[],但是会退化成指针类型,因此本质上函数参数只支持指针类型,不支持数组类型。返回值同样不支持数组。

例如:int *f(int a[],int b);等价于:int *f(int *a, int b);。

10,字符串数组

       (1)字符串数组其实是char字符型的二维数组。字符串是一维char数组,字符串数组是二维数组,保存多个字符串时使用。

          例如:char c[2][6];,声明2个一维字符数组,每个字符数组最多存储6个字符,如果保存字符串,最多保存5个字符,第6个字符必须是'\0'。

          例如:如何保存和输出"hello" "world"两个字符串到字符串数组。

#include <stdio.h>
int main(void) 
{
    char c[2][6] = {"hello","world"};
  
    printf("%s\n", c[0]);
    printf("%s\n", c[1]);
    return 0;
} 

二,函数

1,定义及特点
           (1)C语言函数和数学函数概念相似,给定参数(类似自变量),计算出相应的结果(因变量的值)。

               (2)C语言程序至少有一个main函数作为程序入口,完整的C语言程序可以是一个大的main函数。

                (3)当C语言程序完成的功能较多时,为简化问题、阅读方便、代码重用,可以将化整为零、化大为小,将C语言程序封装成一个一个小的“子函数”,供main函数调用。

                (4)C语言函数的特点:

       •函数由返回值、函数名称、参数类型、函数体构成,其中返回值和参数需要声明类型
       •与函数体相对,返回值、函数名称、参数合起来可以称为 函数头
       •一个函数一般实现一个独立的功能,完成一个特定的计算
       •函数返回值至多一个,可以不返回值,此时返回值类型是void
       •函数参数可以有多个,也可以没有参数,此时函数参数写成void空参数
       •C语言标准库提供大量常用函数,可以直接调用,无需重新编写

备注:C语言中函数名不能相同,不支持重载,即使返回值类型、参数个数和类型不一样也不行,不是靠函数原型区分。
 

2,声明与定义

        (1)函数声明:指定函数头(返回值类型、函数名、参数类型),但是没有定义函数体。

语法如下:

返回值类型   函数名称(参数类型1 参数名1,参数类型2 参数名2,...);
注:声明时,参数名可以省略,参数名对函数声明没有影响。

         (2)函数定义:函数头和函数体均定义,其中函数体通过花括号 {} 定义。

语法如下:

返回值类型   函数名称(参数类型1 参数名1,参数类型2 参数名2,...)
{
    // 一系列C语句,计算
    return 返回值;  // 返回值
}

例如:声明和定义模板。

// 声明函数fun,返回值和参数都为空
void  fun(void);    

// 声明和定义函数fun,返回值和参数都为空
void fun(void)      
{
    // 这句可省略
    return;     
}

// 声明函数fun,返回值为int型,参数为2个int型
int sum(int a, int b);   
   
// 等价于上面sum函数声明
int sum(int, int);      

// 声明和定义函数sum,该sum声明和上面两种声明等价
// 参数名称对函数类型没有影响
int sum(int c, int d)
{
    return c+d;
}

3,函数的调用
       (1)函数调用通过 函数名称(参数列表) 实现,参数个数和类型要和函数声明一一对应。

          (2)其中函数声明的参数其实是形式参数,没有任何值;当函数调用时传递的参数,是实参,具备真正的参数值,传给函数体使用。

           (3)函数调用前提条件是函数必须声明和定义,仅有声明是不完整的,如果定义在其它外部文件,需要先引入函数声明,编译时链接函数外部文件定义,才能实现函数调用,否则报错。
4,参数值传递

         (1)函数调用时传递参数,C语言本质上只支持值传递,调用函数也就是将值拷贝一份传递给被调用函数的形式参数,在函数中修改该值,不会影响调用函数。

例如:修改函数参数值。

#include <stdio.h>

// 修改参数值为1000 
void modify(int a)
{
 a = 1000;
}

int main(void) 
{
 int a=10;
 modify(a);
 printf("%d\n",a);
 return 0;
} 

5,指针传递

        (1)参数传递不能修改调用函数变量的值,通过指针传递可以间接实现类似“引用调用”的结果。

         (2)引用传递:指的是调用函数直接将参数变量传递给被调用函数,该变量只有一个,不拷贝变量值。

#include <stdio.h>

// 修改参数值为1000 
void modify(int *a)
{
    // 间接修改指针所指向变量的值
 *a = 1000;
 
 // 直接修改指针的值0
 a = (int *)0; 
}
int main(void) 
{
 int a=10;
 int *p = &a;
 modify(p);
 printf("%d\n",a);
 printf("%p\n",p);
    return 0;
} 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值