C语言知识:数组和指针

 2024-03-07 02:04:22  阅读 0

目录

数组 一维数组

某一数据类型的变量的集合,位于一块连续的内存上

1、功能:

方便地定义相同数据类型的变量

整数数[30];

相当于:

整数 num1;

整数 num2;

。 。 。

整数 num30;

2、数组框架:

元素的数据类型变量名[元素数量];

元素的数据类型: 基本数据类型:int char float。 。 。

此外:int *、char *、...

元素数量:正整数

3.如何定义数组:

(1) int a[3]; //未初始化的定义,定义了一个有3个元素的数组。 数组的元素类型为:int,数组的成员值为随机值。

(2) int a[3]={1,2,3}; //所有初始化定义都定义了一个包含 3 个元素的数组。 数组的元素类型为:int,数组的成员值为

a[0] == 1、a[1] == 2、a[2] == 3

(3) int a[3]={1,2}; //部分初始化定义定义了一个包含3个元素的数组。 数组的元素类型为:int,数组的成员值为

a[0] == 1,a[1] == 2,a[2] == 0

(4) int a[]={1,2,3,4,5}; //不定长数组,必须初始化,定义一个有5个元素的数组,数组的元素类型为:int,数组成员值为

a[0] == 1、a[1] == 2、a[2] == 3、a[3] == 4、a[4] == 5

(5)

整数;

scanf("%d", #);

int a[数字]; //变长数组无法初始化。 定义时,必须确定num的值。 定义了一个包含 num 个元素的数组。 数组的元素类型为:int;

如果要给数组赋值,需要一一赋值。

4.计算数组内存大小:

数组内存大小==数组元素类型占用的字节数*元素数量

int a[5]={1,2,3,4,5};

(a) == (int)*5 == 4*5 ==20

5. 访问数组元素:

int a[5]={1,2,3,4,5};

a[0] == 1 第一个元素的地址 &a[0] == &(a[0])

a[1] == 2 第二个元素的地址 &a[1] == &(a[1])

a[2] == 3第三个元素的地址&a[2] == &(a[2])

a[3] == 4第四个元素的地址&a[3] == &(a[3])

a[4] == 5第五个元素的地址&a[4] == &(a[4])

访问数组元素的下标:0~(数组元素个数 - 1)

6、数组名称和数组数据类型的问题:

数组名是数组第一个元素的地址

int a[5] = {1,2,3,4,5};

a==&a[0]

//去掉变量名,剩下的就是它的数据类型

整数a[5]; 其数据类型为:int()[5]

字符a[4]; 其数据类型为:char()[4]

数据类型+变量名

整数a; 它的数据类型是:int

=================================================== =======================

学习数组后需要掌握的知识点:

1. 定义数组

2.给数组赋值

3.正确输出数组数据

4.数组的大小

5.数组的内存映射

=================================================== =======================

二维数组1本质上是一个一维数组

元素数据类型为一维数组的数组称为二维数组。

int a[2][3]; ==>int(a[2])[3];

2. 二维数组定义模型

小数组的元素类型变量名[N][M];

N --> 大数组的元素数量。 大数组就是指这个二维数组。

M --> 小数组的元素数量。 小数组是指二维数组的元素。

小数组的元素类型——“int、char、float...

3.二维数组的定义与初始化

(1) int a[2][3]; //未初始化的定义,定义了一个二维数组。 该数组有两个元素。 元素类型为:int()[3],其值为随机值。

(2) int a[2][3]={{1, 2, 3}, {4, 5, 6}}; //所有初始化定义都定义了一个包含两个元素的二维数组。 元素类型为:int()[3],其值:

a[0][0]==1、a[0][1]==2、a[0][2]==3、a[1][0]==4、a[1][1 ]==5,a[1][2]==6

(3) int a[2][3]={1,2,3,4,5,6}; //所有初始化定义都定义了一个包含两个元素的二维数组。 元素类型为:int()[3],其值:

a[0][0]==1、a[0][1]==2、a[0][2]==3、a[1][0]==4、a[1][1 ]==5,a[1][2]==6

(4) int a[2][3]={{1}, {4, 5}}; //部分初始化定义定义了一个包含两个元素的二维数组。 元素类型为:int ( )[3],其值:

a[0][0]==1、a[0][1]==0、a[0][2]==0、a[1][0]==4、a[1][1 ]==5,a[1][2]==0

(5) int a[2][3]={1,2,3}; //部分初始化定义定义了一个包含两个元素的二维数组。 元素类型为: int ()[3] ,其值:

a[0][0]==1、a[0][1]==2、a[0][2]==3、a[1][0]==0、a[1][1 ]==0,a[1][2]==0

(6) int a[][3]={{1,2,3},{4}}; //变长二维数组定义了一个二维数组。 数组有两个元素,元素类型为:int()[3] 二维数组定义了一个二维数组。 该数组有两个元素。 元素类型为:int()[3]。 其值为:

a[0][0]==1、a[0][1]==2、a[0][2]==3、a[1][0]==4、a[1][1 ]==0,a[1][2]==0

int a[2][]={{1, 2, 3},{4}};//必须确定小数组的元素个数,否则编译会报错

4. 二维数组的大小

二维数组的大小==小数组的元素类型大小*小数组的元素个数*大数组的元素个数==大数组的元素个数*数据类型小数组的大小

int a[2][3];

(a) == (int)*2*3 == 4*2*3 == 24

5. 访问数组元素

int a[2][3]; //这种数组称为两行三列数组。

a[0][0]==1,--》元素地址为:&a[0][0]

a[0][1]==2,--》元素地址为:&a[0][1]

a[0][2]==3,--》元素地址为:&a[0][2]

a[1][0]==4,--》元素地址为:&a[1][0]

a[1][1]==5,--》元素地址为:&a[1][1]

a[1][2]==6,--》元素地址为:&a[1][2]

指针数组1.概念:

它本质上是一个一维数组,其元素类型是指针。

2. 定义模型

整数a;

整数b;

整数c;

整数d;

int *p1 = &a;

int *p2 = &b;

int *p3 = &c;

int *p4 = &d;

(int *) a[4]; ==> int *arry[4]; //定义一个4个元素的数组,元素类型为:int *

//arry[0] 的类型为:int *

//&arry[0] 类型为:int **

arry[0] = &a;

arry[1] = &b;

arry[2] = &c;

arry[3] = &d;

=================================================== =======================

指针一级指针1.概念:

指针也是变量的一种类型。 指针变量用于存储相应变量的内存地址。

2.如何定义指针变量

Model:存储变量的数据类型*变量名

int a;//定义一个整型变量

a = 100; //将100转换成二进制存入整型变量a中

整数*p; //定义了一个整型指针变量,准备存放整型变量的内存地址。

p = &a; //获取变量a的地址并将其存储到指针变量p中

3.如何使用指针变量(解引用、获取目标)

整数a=100;

int *p=&a;

*p = 200; //通过指针变量访问,存储内存地址数据

//int *p=&a;

相当于

整数*p;

p=&a;

不等于:

整数*p;

*p=&a;

4、指针内存大小:

32位系统占用4字节

64位系统占用8个字节

5.指针加减-->内存地址加减

整数a=100;

int *p=&a;

假设 p 的值为:

p==

综上所述:

p+1 == +(int) ==

字符b=100;

字符 *b_p=&b;

综上所述:

b_p+1 == b_p+1*(字符)

长长c=100;

长长 *c_p=&c;

综上所述:

c_p+1 == c_p+1*(长长)

总结:

整数指针+1 == 整数指针+1*(int)

字符指针+1 == 字符指针+1*(字符)

字符指针+2 == 字符指针+2*(字符)

long long 指针+2 == long long 指针+2*(long long)

注意:

指针加减要考虑其存储的对象的大小。

在添加或减少内存地址时,还必须考虑其存储的对象的大小。

内存地址由两部分组成:地址值和存储的对象。

6.指针变量数据类型问题

整数a=200; a的数据类型是:int

200的类型是:int

&a的类型为:int *

int arry[3]; 该数组的数据类型为:int()[3]

&arry 的类型为:int (*)[3]

int *p=&a; p的数据类型为:int *,存储对象的类型为:int

&p的类型为:int **,存储的对象的类型为:int *

&a的类型为:int *,存储的对象类型为:int

7. 万能指针( point)

void *p //通用指针(),可以合法存储任何类型的变量地址,但存储后类型会变成void *。

void * 指针,无存储对象

整数a;

无效 *p = &a;

注意:要取消引用通用指针,必须首先强制转换类型

8. NULL --> 空指针

指针的零值:

# 空(无效*)0x0

整数*p; //p 包含一个随机值。 这种指针也称为野指针。 野指针是非常危险的,所以如果指针定义后没有初始化,就给它赋值NULL,这样比较安全。

int *p = NULL;

*p = 100;

取消引用 NULL 指针将导致段错误:

gec@:/mnt/hgfs/C语言/05/code$ ./a.out

故障(核心)-->分段故障(未经访问权限非法访问内存)

=================================================== =======================

二级指针1.概念:

指针变量用于存储可变的内存地址

一级指针存储的是指针变量以外的变量的地址。

辅助指针存储主指针变量的地址

2. 定义模型

一级指针变量类型*变量名;

字符*p;

字符 **q = &p;

int *p1;

int **q1 =&p1;

3、辅助指针的大小:

32位系统占用4字节

64位系统占用8个字节

int **q;

4==(q)

4.辅助指针数据类型问题

int **q; q 的数据类型为:-->int **

&q 的类型为:-->int ***

整数*p; p -->int *

&p -->int **

整数a; 一个-->整数

&a -->int *

=================================================== =======================

数组指针1.概念:

它本质上是一个一级指针,用于存储数组的地址。

整数a[2]; //其类型为:int()[2]

//&a的类型是:int (*)[2]

定义对应类型的指针变量来合法存储数组地址

int (*p)[2] = &a;

整数a; //它的类型是:int

//&a的类型是:int *

int *p = &a;

2. 定义模型:

字符a[10]; //其类型为:char()[10]

//&a的类型为:char(*)[10]

字符 (*p)[10] = &a;

整数a[2]; //它的类型是:int()[2]不等于int()[10]

//&a的类型是:int (*)[2]

定义对应类型的指针变量来合法存储数组地址

int (*p)[2] = &a;

int (*p1)[10] = &a; //非法存储

int a[2][3]; //其类型为:int()[2][3]

//&a的类型为:int (*)[2][3]

int (*p)[2][3] = &a

模型:

数组数据类型*变量名

3、内存大小:

32位系统占用4字节

64位系统占用8个字节

如本站内容信息有侵犯到您的权益请联系我们删除,谢谢!!


Copyright © 2020 All Rights Reserved 京ICP5741267-1号 统计代码