C语言——数组,指针,指针数组,数组指针

news/2024/11/14 11:53:19/

零、存储单元和地址

计算机在保存数据时,把数据放在一个个存储单元中,存储单元可以理解为一个个小房间。

地址就是存储单元(小房间)的房间号,且这个房间号是唯一的。

详细请学习计算机组成原理3.1

一、变量a

	int a=5;//输出a的值printf("a=%d\n", a);//输出a的地址printf("a=%p\n", &a);

发现:a的值是5,a的地址后四位F314。

理解:这里就是把5放进了一个名字叫a的存储单元(小房间),这个存储单元的房间号是F314。

二、指针b

//指针b指向a
int* b = &a;
//指针b的值
printf("b=%p\n", b);
//指针b的地址
printf("b=%p\n", &b);

1.发现:b的值和a的地址相同都是F314,b的地址是F338

2.那么计算机是如何通过b的地址访问到a的值呢?

首先,计算机通过b的地址(F338)找到b保存的内容(F314)。

然后,因为b的内容是a的地址,通过a的地址(F314)访问a的内容(5)。

3.&和*:b=&a就是b存储单元指向了a存储单元。*b就是通过b存储单元保存的内容找到a存储单元的内容

	//通过b访问aprintf("a=%d\n", *b);

三、数组c

int c[3] = { 1,2,3 };
//打印c的值
for (int i = 0; i < 3; i++) {printf("c[%d]=%d ",i, c[i]);
}
printf("\n");
//打印c的地址
printf("c=%p\n", c);
//打印c中各个元素的地址
for (int i = 0; i < 3; i++) {printf("c[%d]=%p ", i, &c[i]);
}

发现:c的值是1,2,3

c的地址是F358

c[0]的地址是F358,c[1]的地址是F35C,c[2]的地址是F360

结论一:c的地址和c[0]的地址一样,所以数组返回的是一个地址且是该数组的首地址。

结论二:c[0]和c[1]的地址相差4B,也就是32位,刚好是一个int

四、指针数组d

int* d[3];
//c的各个元素的地址给d
for (int i = 0; i < 3; i++) {d[i] = &(c[i]);
}
//打印d的值
for (int i = 0; i < 3; i++) {printf("d[%d]=%p ",i, d[i]);
}
printf("\n");
//打印d的地址
for (int i = 0; i < 3; i++) {printf("d[%d]=%p ",i, &(d[i]));
}

发现:d的值和c的地址一样,d的地址相差8B

重点一:指针数组的定义int *d[3]。因为[]的优先级高于*,所以这是一个数组,数组名是d,数组元素是int *(整型数据的地址),数组长度是3。

重点二:因为指针数组d保存的地址,我们让d的各元素对应c的各元素的地址,所以d的值和c的地址对应(F358,F35C,F360)。

重点三:d的地址分别是F3C8,F3D0,F3D8,所以d的地址相差8B。因为d的内容存的是c的地址,所以地址大小是8B。这里是整型数据的地址,如果是char类型的地址同样是8B,感兴趣的可以自行尝试。

//d表示c
for (int i = 0; i < 3; i++) {printf("c[%d]=%d ", i, *(d[i]));
}

这里解d的各元素的地址,找到d的各元素的内容(c的地址)对应的值。

五、二维数组e

//定义二维数组
int e[3][3] = { {1,2,3},{4,5,6},{7,8,9} };
//打印二维数组
for (int i = 0; i < 3; i++) {for (int j = 0; j < 3; j++) {printf("%d ", e[i][j]);}printf("\n");
}
//打印二维数组的地址
printf("e=%p\n", e);
//打印二维数组各元素的地址
for (int i = 0; i < 3; i++) {printf("e[%d]=%p ", i, &e[i]);
}

发现:e和e[0]的地址一样,e[0]=F458,e[1]=F464,e[2]=F470

结论一:因为e和e[0]的地址一样,所以二维数组e的地址是二维数组e是首地址

结论二:e[0]=F458,e[1]=F464,e[2]=F470,各地址相差12B。因为定义二维数组有3列,一个int型数据是占4B。一行3列就是3个int型数据,也就是12B.

六、数组指针f

int(*f)[3] = e;
for (int i = 0; i < 3; i++) {printf("f[%d]=%p ",i, f[i]);
}

发现:f的内容和e的地址相同

结论一:int(*f)[3],因为()的优先级大于[],()中是*p,所以这是一个指针。这个指针叫f,[]说明这个指针指向的内容是一个数组,int说明这个数组的元素是int型。所以这是一个指向由整形数据组成的数组的指针。

结论二:让这个数组指针等于e,所以把e的地址给了f,所以f的内容和e的地址相同。


http://www.ppmy.cn/news/1526841.html

相关文章

【C++算法】位运算

位运算基础知识 1.基础运算符 << : 左移 >> : 右移 ~ : 取反 & : 按位与&#xff0c;有0就是0 I : 按位或&#xff0c;有1就是1 ^ : 按位异或&#xff0c;&#xff08;1&#xff09;相同为0&#xff0c;相异为1&#xff08;2&#xff09;无进位相加 2.…

【React Native】第三方组件

WebView Picker mode {‘dropdown’} 只在 android 生效 Swiper 搭配 ScrollView 使用 AsyncStorage AsyncStorage.setItem()AsyncStorage.getItem()AsyncStorage.removeItem()AsyncStorage.clear() Geolocation 配置添加获取定位信息的授权许可&#xff0c;在 androi…

双亲委派机制知识点

类加载器 双亲委派模型 为什么采用双亲委派模型 打破双亲委派机制的场景 Tomcat 打破双亲委派机制:目的是可以加载不同版本的jar包 实现类隔离&#xff1a;在Tomcat中&#xff0c;每个Web应用使用独立的类加载器加载类文件&#xff0c;这样做的好处在于&#xff0c;当在同一T…

软件设计师考试笔记

计算机系统知识 计算机硬件基础 1.1 计算机组成原理 • 中央处理器&#xff08;CPU&#xff09;&#xff1a; o CPU是计算机的核心部件&#xff0c;负责执行指令并进行算术与逻辑运算。它由控制单元、运算单元和寄存器组组成。 o 控制单元&#xff08;CU&#xff09;&#xff…

React js Router 路由 2, (把写过的几个 app 组合起来)

完整的项目&#xff0c;我已经上传了&#xff0c;资源链接. 起因&#xff0c; 目的: 每次都是新建一个 react 项目&#xff0c;有点繁琐。 刚刚学了路由&#xff0c;不如写一个 大一点的 app &#xff0c;把前面写过的几个 app, 都包含进去。 这部分感觉就像是&#xff0c; …

Python 错误 ValueError 解析,实际错误实例详解 (一)

文章目录 前言Python 中错误 ValueError: No JSON object Could Be Decoded在 Python 中解码 JSON 对象将 JSON 字符串解码为 Python 对象将 Python 对象编码为 JSON 字符串Python 中错误 ValueError: Unsupported Pickle Protocol: 3Python 中的 Pickling 和 UnpicklingPython…

王道408考研数据结构-绪论

1.1 数据结构的基本概念 数据结构 数据结构是相互之间存在一种或多种特定关系的数据元素的集合。在任何问题中&#xff0c;数据元素 都不是孤立存在的&#xff0c;它们之间存在某种关系&#xff0c;这种数据元素相互之间的关系称为结构(Structure)。 数据结构包括三方面的内…

DAY20240911 VUE:解锁前端路由的奥秘:如何在单页应用中避免404困境?

VUE:路由模式&#xff1a;解锁前端路由的奥秘&#xff1a;如何在单页应用中避免404困境&#xff1f; 前言路由模式常见问题1. 先有后端路由&#xff0c;再有前端路由2. 浏览器分不清是前端路由还是后端路由3. 发布和打包4. 解决404问题的方法 参考 前言 小知识&#xff1a;在W…