一道题目玩转指针数组和二级指针

博客围绕C语言相关题目展开,给出运行结果并进行分析,涉及算法与数据结构方面的内容。

 题目:

1. #include <stdio.h>
2.
3. int main(){
4. char *lines[5] = {
5. "COSC1283/1284",  //string0
6. "Programming",    //string1
7. "Techniques",     //string2
8. "is",             //string3
9. "great fun"       //string4
10. };
11.
12. char *str1 = lines[1];
13. char *str2 = *(lines + 3);
14. char c1 = *(*(lines + 4) + 6);
15. char c2 = (*lines + 5)[5];
16. char c3 = *lines[0] + 2;
17.
18. printf("str1 = %s\n", str1);
19. printf("str2 = %s\n", str2);
20. printf(" c1 = %c\n", c1);
21. printf(" c2 = %c\n", c2);
22. printf(" c3 = %c\n", c3);
23.
24. return 0;
25. }

运行结果: 

str1 = Programming
str2 = is
c1 = f
c2 = 2
c3 = E

分析如下:

①lines[1]:它是一个指针,指向字符串 string1,即 string1 的首地址。
 ②*(lines + 3):lines + 3 为数组中第 3 个元素的地址,*(lines + 3) 为第 3 个元素的值,它是一个指针,指向字符串 string3。
③ *(*(lines + 4) + 6):*(lines + 4) + 6 == lines[4] + 6 == string4 + 6,表示字符串 string4 中第 6 个字符的地址,即 f 的地址,所以 *(*(lines + 4) + 6) 就表示字符 f。
④ (*lines + 5)[5]:*lines + 5 为字符串 string0 中第 5 个字符的地址,即 2 的地址,(*lines + 5)[5]等价于 *(*lines + 5 + 5),表示第 10 个字符,即 2。
*lines[0] + 2:lines[0] 为字符串 string0 中第 0 个字符的地址,即 C 的地址;*lines[0] 也就表示第 0 个字符,即字符 C。字符与整数运算,首先转换为该字符对应的 ASCII 码,然后再运算以 *lines[0] + 2 = 67 + 2 = 69,69 对应的字符为 E。
指针数组二级指针都是C/C++中处理内存地址数据的重要概念,但它们在使用表示结构上有所不同。 1. 指针数组:一个指针数组是一组指向同一类型变量的地址的存储。例如,如果我们有一个整型数组,我们可以创建一个指向这个数组元素的指针数组,每个元素都是指向整数的指针。这表示为 `int* arr[num_elements]`。指针数组主要用于遍历或操作数组中的元素,通过指针间接访问。 2. 二级指针二级指针是一个指针,它指向的是另一个指针。这意味着它是一个指向指针指针。例如,如果有一个指针数组,那么一个二级指针就可以指向这个数组中的任意一个指针,如 `int** ptrArr`。二级指针通常用于动态分配内存、管理动态数组或在函数之间传递指向数组的引用。 两者的区别主要在于: - **层次关系**:一级指针直接指向变量,而二级指针则指向其他指针,形成了更深的层次结构。 - **用途**:一级指针数组更常见于操作固定大小的连续内存区域,二级指针则常用于处理动态内存分配或复杂的数据结构,如链表、树等。 - **灵活性**:二级指针提供了更大的灵活性,可以通过改变二级指针的值来改变所指向的一级指针,进而操作不同部分的内存。 相关问题: 1. 指针数组的应用场景有哪些? 2. 什么时候会用到二级指针来管理动态内存? 3. 在链表或树的数据结构中,二级指针是如何运作的?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值