------------恢复内容开始------------
作业信息
这个作业属于哪个课程 | 2024-2025-1-计算机基础与程序设计(https://edu.cnblogs.com/campus/besti/2024-2025-1-CFAP)) |
---|---|
这个作业要求在哪里 | 2024-2025-1计算机基础与程序设计第十二周作业 |
这个作业的目标 | 指针和数组 |
作业正文 | 本博客链接 |
教材学习内容总结
《C语言程序设计》第十一章 指针与数组 内容总结:
1. 指针和一维数组的关系
- 数组名与指针
- 在C语言中,数组名可以被看作是一个指针常量,它指向数组的第一个元素。例如,对于数组
int a[5];
,a
等同于&a[0]
,即a
是指向a[0]
的指针。
- 在C语言中,数组名可以被看作是一个指针常量,它指向数组的第一个元素。例如,对于数组
- 通过指针访问数组元素
- 可以使用指针来访问数组元素。例如:
int a[5] = {1, 2, 3, 4, 5}; int *p = a; printf("%d", *p); // 输出1,即a[0] p++; printf("%d", *p); // 输出2,即a[1]
- 这里
p
是一个指向int
类型的指针,通过p++
可以顺序访问数组中的元素。
2. 指针和二维数组的关系
- 二维数组的存储方式
- 二维数组在内存中是按行顺序存储的。例如
int a[2][3];
在内存中的存储顺序是a[0][0]
、a[0][1]
、a[0][2]
、a[1][0]
、a[1][1]
、a[1][2]
。
- 二维数组在内存中是按行顺序存储的。例如
- 指向二维数组的指针
- 可以定义一个指针指向二维数组。例如:
int a[2][3] = {{1, 2, 3}, {4, 5, 6}}; int (*p)[3] = a; printf("%d", *(*p + 1)); // 输出2,即a[0][1]
- 这里
p
是一个指向包含3个int
类型元素的数组的指针。通过*(*p + 1)
可以访问二维数组中的元素。
3. 指针数组及其应用
- 指针数组的定义
- 指针数组是一个数组,其元素为指针类型。例如:
int *a[3]; int b = 1, c = 2, d = 3; a[0] = &b; a[1] = &c; a[2] = &d;
- 这里
a
是一个包含3个int
指针的数组,分别指向b
、c
和d
。
- 应用 - 字符串数组
- 指针数组常用于处理字符串数组。例如:
char *strs[] = {"apple", "banana", "cherry"}; for (int i = 0; i < 3; i++) { printf("%s\n", strs[i]); }
- 这里
strs
是一个字符串指针数组,通过遍历可以输出每个字符串。
4. 动态数组
- 动态内存分配函数
- C语言中通过
malloc
、calloc
和realloc
函数来进行动态内存分配。 malloc
函数:例如,分配一个包含5个int
类型元素的动态数组:
int *a = (int *)malloc(5 * sizeof(int)); if (a == NULL) { // 内存分配失败处理 }
calloc
函数:除了分配内存,还会将内存初始化为0。例如:
int *b = (int *)calloc(5, sizeof(int));
realloc
函数:用于重新分配内存大小。例如,将上述a
所指向的内存空间扩大:
a = (int *)realloc(a, 10 * sizeof(int)); if (a == NULL) { // 内存重新分配失败处理 }
- C语言中通过
- 动态数组的使用优势
- 动态数组可以根据程序运行时的实际需求来分配内存,避免了静态数组在编译时就确定大小的局限性,提高了内存的利用率。
教材学习中的问题和解决过程(先问 AI)
一、指针和二维数组在内存中是如何存储的?
解答:这是个很好的问题。在内存中,二维数组是按行顺序存储的。
比如说有一个二维数组int a[2][3]
,它在内存中的存储顺序就像是把这个二维数组“展开”成一个一维数组一样。先是存储第一行的元素a[0][0]
、a[0][1]
、a[0][2]
,然后紧接着存储第二行的元素a[1][0]
、a[1][1]
、a[1][2]
。
从指针的角度来看,如果我们把二维数组的名字(比如a
)看作是一个指针,这个指针指向的是二维数组的第一行(也就是第一个包含3个int
类型元素的数组)。如果我们对这个指针进行算术运算,比如a + 1
,它会根据二维数组的列数(这里是3)来计算偏移量,实际上会跳过第一行的3个元素,指向下一行(也就是第二个包含3个int
类型元素的数组)。
二、什么是指针的偏移?
解答:指针偏移是指改变指针所指向的内存位置。
在C语言中,当我们有一个指针,比如int *p;
,假设p
当前指向一个内存地址,p++
就是一种指针偏移操作。因为p
是指向int
类型的指针,p++
会让p
指向的地址增加sizeof(int)
个字节。
对于数组来说,这种指针偏移就很有用。例如有一个一维数组int arr[5] = {1, 2, 3, 4, 5};
,int *p = arr;
,最初p
指向arr[0]
,当我们执行p++
时,p
就会指向arr[1]
,这是因为p
的偏移量是根据int
类型的大小来计算的。
对于二维数组,指针偏移会更复杂一点。假设有一个二维数组int a[2][3]
,int (*p)[3] = a;
,这里p
是一个指向包含3个int
类型元素的数组的指针。当我们执行p++
时,p
会跳过一行(也就是3个int
元素),指向二维数组的下一行。
基于AI的学习
代码调试中的问题和解决过程
问题一:ojCP1296输出元音字母个数的问题,自己交上的代码总显示部分接受
解决:自己发现每个字母输出一次即可,而自己的代码会使同一个元音字母输出多次
问题二:结构体编程题按成绩高低排序
解决:不能将所有结构体中声明的变量轮番呼唤,要换结构体变量的下标,否则程序运行不起来,而且改后更简单明了
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第十二周 | 600/3600 | 2/17 | 15/210 | |
计划学习时间:20h | ||||
实际学习时间:20h |
------------恢复内容结束------------
标签:指向,int,元素,2024,2025,二维,数组,20241305,指针 From: https://www.cnblogs.com/yaohang/p/18606867