数组、指针、字符串

本文深入解析C语言中数组、内存地址、指针和字符串的基本概念与操作方法,包括数组元素的初始化、内存地址的引用、指针变量的使用及其相关运算符、单个字符的输入输出、字符串的初始化与操作函数,以及二维数组与字符串数组的特性。同时,阐述了指针数组和函数指针的概念,并提供了二维数组初始化的理论依据和指针数组的操作示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、数组

 数组元素个数必须是一个固定的值,可以是整形常量、符号常量及整形常量表达式

 数组下标可以是整形常量、整形变量或者整形表达式

 数组可以全部初始化,此时元素个数可以省略;也可部分初始化,元素个数不可省略

 数组初始化的赋值方式只能用于数组的定义,定义之后再赋值只能一个一个元素赋值

2、内存地址

 计算机内存是以字节为单位的存储空间,内存的每一个字节都有一个唯一的编号,这个编号就是地址。当C程序中定义一个变量时,系统就分配一个带有唯一地址的存储单元来存储这个变量,程序对变量的读取操作,实际上是对变量所在地址存储空间进行读取或写入数据。

 直接引用:通过变量名引用变量(系统自动将变量名转换为变量的存储地址)

 间接引用:将变量的地址存放在一个变量中,然后通过存放变量地址的指针变量来引用该变量

3、指针变量

 一个变量的地址称为该变量的指针

 用来存放一个变量地址的变量称为指针变量

 指针变量定义的一般形式为:类型名 * 指针变量名

 注:变量名前面的 "*"是一个说明符,用来说明该变量是一个指针变量,不能省略,但不是变量名的一部分

        类型名表示指针变量所指向的变量类型,而且只能指向这种类型的变量

  指针变量相关运算符:

  &  取地址运算符

  *  指针运算符,取内容

 注:指针变量用来存放地址,故不能给指针变量赋常数值

       指针变量没有指向明确的地址前,不能对它所指向的对象赋值

 对指针进行加1操作,会使指针指向下一个元素

 示例:指向 int 型数据的指针加1,其指向的地址加4

           指向 char 型数据的指针加1,其指向的地址加1

 理解关键:

 将指针的类型分为两个概念,一个是指针自身的类型,一个是指针指向数据的类型

4、单个字符的输入输出

 getchar( ):从输入设备中读取一个字符

 例:

 char c = getchar( );     等价于    scanf_s("%c",&c,1);

 注:getchar()可以接收回车字符,而scanf()将回车作为数据的间隔符或结束符,且getchar()接收的字符可以不赋给任何变量

 putchar( ):将一个字符输出到输出设备

 例:

 char c = ‘a’;        putchar(c);

 putchar()可以输出字符型变量、整型变量、字符型常量以及控制字符和转义字符

 比较:putchar()一次只能输出一个字符,而printf()一次能输出多个字符

5、字符串

 在C语言中,字符序列当作字符串处理,字符串的处理基于字符数组,字符串在存储时其尾部添加结束标志‘\0’('\0'代表ANSI码为0的字符,是一个空操作符)

 字符串初始化方式:

 char c[10] = {"Hello world"};

 char c[10] = "Hello world";

 char c[ ]    = "Hello world";

 char c[9];     scanf("%s",&c,sizeof(c));

6、字符串操作函数

 puts( ):字符串输出

 gets( ):字符串输入

 strlen( ):计算字符串长度

 strcat( ):字符串连接

 strcmp( ):字符串比较

7、辨析

 sizeof( ):计算字节数,包含 '\0'

 strlen( ) :计算字符串实际长度,不包含 '\0'

 coutof( ):计算字符数组元素个数,包含 '\0'

 三者都将空格计入总数

8、二维字符串数组及多维数组

 一维字符数组存放一个字符串
 二维字符串数组存放多个字符串
 多维数组可看作是比其少一个维度的数组的集合

 注:二维及二维以上的多维数组,都是先存放低维数据,以此类推

9、二维数组初始化:

 理论依据:数组元素在内存中线性存放

 全部初始化时,按数组存储顺序赋初值
 部分初始化时,高维元素个数可省略,低维元素个数不可省略。但是,要在初始化时体现出高维元素个数,即体现出一维数组个数

10、指针数组

 不带下标的二维数组名表示二维数组的起始地址,进行加法操作时则表示作为其元素的一维数组的起始地址
 不带下标的一维数组名表示一维数组的起始地址,进行加法操作时则表示该一维数组一个元素的起始地址
 即,加法操作时数组降维

 例:

 int a[3][4],*p;
 p = a[0];
 此处p指向一维数组a[0]的起始地址,对其进行加法操作时 p+1 等同于 a[0]+1 ,此时 a[0] 降维至 a[0][0],故其指向数组元素 a[0][1],

则 *(p+1)等于元素 a[0][1] 的值

 int a[3][4],(*p)[4];
 p = a;
 此处p指向二维数组a的起始地址,对其进行加法操作时 p+1 等同于 a+1,此时 a 降维至 a[0],故其指向数组元素 a[1],

(p+1)等于一维数组名(起始地址),(p+1)+1 等同于 a[1]+1,则 (p+1)+1) 等同于 a[1][1]

11、函数指针

 函数在内存中占有一片连续的内存区域保存其二进制代码,而函数名在C语言中代表这片连续的内存区域的首地址,故函数名可用指针替换

 指向函数的指针变量的一般形式为:

 数据类型 (*指针变量名) (形参表列)

 例: int (*MyFun) (int,int)

 数据类型即函数返回值类型
 形参表列即函数形式参数表列

12、二级指针

 指针本身也是变量,因此也有自己的地址。
 我们可以将一个指针变量分为两个部分,一部分存放变量的地址,另一部分是其自身的地址。了解这一点,二级指针的概念就比较容易理解了。
 故二级指针就是在一级指针的基础上再增加一个指针,用来存放一级指针的地址,而其本身也有自己的地址,依此类推
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值