【跟着小甲鱼学C语言】P23 数组指针和指针数组

这篇博客详细介绍了C语言中的数组指针和指针数组的概念,包括它们的区别和使用。内容涵盖指针和数组名的不同、指针数组的定义、数组指针的本质,并通过实例解析了编译器如何处理变量。同时,博主分享了一道关于数组指针的课后习题,探讨了指针使用索引的情况。

数组指针和指针数组

1.指针和数组名的区别

指针是一个变量,这个变量里面存放的内容是一个内存地址。

而数组名可以看成是一个地址常量,其实也可以称它为一个指针,不过它是一个指针常量,而不是指针变量,它不是左值,不能被修改,所以不能用“++”这样的操作符去操作它。

2.什么是指针数组

int *p1[5]就定义了一个指针数组,就是定义了一个指针数组。指针数组本质是一个数组,但这个数组的每一个元素都是一个指针,即是说可以理解为,指针数组是每个元素的内容都是一个内存地址的数组。所以这里的p1是一个数组名,即一个地址常量,而不是指针。

3.什么是数组指针

int (*p2)[5]就定义了一个数组指针,也称为行指针,暗示数组指针指向的不是一个变量,而是一行元素。它的本质是一个指针,且指向一个数组。

举个例子:

int a[4][5];
int (*p)[5]=a;

需要注意的有以下几点:

  1. 这里a是个二维数组的数组名,相当于一个行指针常量(或二级指针常量)。注意a+1&a+1的含义并不相同,a+1代表指向数组第二行的行指针常量,而由于&a代表的是整个数组的位置,所以&a+1会指向数组最后的位置(事实上是数组下一个字节的地址)。

  2. p是一个指针变量,它指向包含5个int元素的一维数组,此时p的增量以它所指向的一维数组长度为单位

  3. (p+i)是一维数组a[i][0]的地址;具体的说,(p+2)指向数组a的第3行,是a第三行第一个元素的地址。那么在这里p+2一共跳过了内存中多少个字节?应该是:每个元素的字节数乘以每行元素的个数再乘上行数,即 4×5×2,共40个字节。

  4. (p+2)+3表示a[2][3]地址(第一行为0行,第一列为0列),*(*(p+2)+3)

任务描述 本关任务:编写一个程序,名为strcat,用命令行参数实现至少两个字符串的连接,命令行为:strcat str1 str2 ... 其中,命令行中strcat是命令名,即可执行程序名,str1、str2是被连接的字符串,每一个字符串的长度不超过50。规定连接顺序为右边的串依次连接到左边串的末尾。 例如:在命令行输入strcat abc def gh; 连接之后形成新串:abcdefgh。 注意:我们在测试文件中编写main来模拟命令行的输入存储,再调用右方编辑器中的main0函数(该函数相当于本地带参的main函数)。因此,大家先在自己的编程环境中实现strcat.c并调试通过后,将main函数代码黏贴到右边编辑器,并将main函数的名字修改为main0,供平台测试代码进行测试。 相关知识 为了完成本关任务,你需要掌握: 指针数组,带参main函数的定义; malloc函数的使用; 命令行编译并运行c语言。 malloc的使用 malloc是C标准库中提供的一个普通函数,用于分配内存: void *malloc(size_t size) 例如: int *p; p = (int *)malloc(sizeof(int)); 分配的内存大小至少为size参数所指定的字节数。我们可以使用malloc为数组动态分配内存,节省空间。 malloc申请的内存是不会主动释放的,当这段内存使用完,需要调用free函数释放掉申请的内存,防止内存泄露: free(p); 命令行编译并运行c语言 在windows环境或linux环境编译c语言程序,需要安装gcc,即GNU编译器套件(GNU Compiler Collection),具体方法请见实验指导书1.4.4节(P23),安装好后,在c程序所在文件夹打开命令行窗口,使用的编译指令为: gcc strcat.c -0 strcat.exe 成功执行后,在所在文件夹中会出现strcat.exe文件,使用命令行窗口执行: strcat.exe abc def 即可成功运行c语言程序。 如果使用集成开发环境进行编译,则在工程所在的文件夹中也会出现编译好的与源程序同名的exe可执行文件,此时可以不需要使用gcc再进行编译,直接使用该exe文件在命令行中运行。 在集成开发环境中运行带参main函数的方法见实验指导书 1.1.7节(codeblocks)或1.2.6节(Dev Cpp)或1.3.6(Visual Studio) 编程要求 测试文件中的main函数模拟命令行输入参数存储,用输入的参数个数字符串数组作参数,调用右方编辑器中带参的main0函数进行处理。生需要编写main0函数来连接命令行中的多个字符串,连接之后的新串无冗余地存储到用malloc动态分配的空间,并将该空间首地址赋值给外部指针p(p在测试文件中定义)。 main0函数只需完成字符串连接,字符串的输出在测试文件中。 测试说明 平台会对你编写的代码进行测试,比对你输出的数值与实际正确数值,只有所有数据全部计算正确才能通过测试: 测试输入: strcat abcdef higdfa 预期输出: abcdefhigdfa 开始你的任务吧,祝你成功!
05-27
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值