今日指针练习
2018-01-23 16:03
183 查看
一、
这个函数有什么问题?该如何修改?
解析:这个str里存在的地址是函数strA栈里“hello world”的首地址。函数调用完成,栈帧恢复调用strA之前的状态,临时空间被重置,堆栈“回缩”,strA栈帧不再属于应该访问的范围。这段程序可以正确输出结果,但是这种访问方法违背了函数的栈帧机制。
但是只要另外一个函数调用的话,你就会发现,这种方式的不合理及危险性。
如果想获得正确的函数,改成下面这样就可以:
首先要搞清楚char *str 和 char str[] :
是分配一个局部数组。局部数组是局部变量,它所对应的是内存中的栈。局部变量的生命周期结束后该变量不存在了。
是指向了常量区的字符串,位于静态存储区,它在程序生命期内恒定不变,所以字符串还在。无论什么时候调用 strA,它返回的始终是同一个“只读”的内存块。
另外想要修改,也可以这样:
答案:
因为这个函数返回的是局部变量的地址,当调用这个函数后,这个局部变量str就释放了,所以返回的结果是不确定的且不安全,随时都有被收回的可能。
二、
第一行,定义数组arr,元素共八个
第二行,定义指针p指向arr数组
此时的*p还是等于arr数组的第0个元素,也就是1
第三行,p++里的++是最后才运算,所以先执行*p+=123,也就是arr的第0个元素被赋值为123
此时arr变成{123,2,3,4,5,6,7,8} ,然后是p++,此时*p已经是等于arr的第1个元素了,也就是2
第四行,在执行printf时,括号里的参数是从右往左的顺序进行读取的,也就是说先执行
最后显示的内容就是:
3,3
这个函数有什么问题?该如何修改?
char *strA() { charstr[] ="hello world"; returnstr; }
解析:这个str里存在的地址是函数strA栈里“hello world”的首地址。函数调用完成,栈帧恢复调用strA之前的状态,临时空间被重置,堆栈“回缩”,strA栈帧不再属于应该访问的范围。这段程序可以正确输出结果,但是这种访问方法违背了函数的栈帧机制。
但是只要另外一个函数调用的话,你就会发现,这种方式的不合理及危险性。
如果想获得正确的函数,改成下面这样就可以:
char *strA() { char*str ="hello world"; returnstr; }
首先要搞清楚char *str 和 char str[] :
char str[] = "hello world";
是分配一个局部数组。局部数组是局部变量,它所对应的是内存中的栈。局部变量的生命周期结束后该变量不存在了。
char *str = "hello world";
是指向了常量区的字符串,位于静态存储区,它在程序生命期内恒定不变,所以字符串还在。无论什么时候调用 strA,它返回的始终是同一个“只读”的内存块。
另外想要修改,也可以这样:
char *strA() { staticcharstr[] ="hello world"; returnstr; } 通过static开辟一段静态存贮空间。
答案:
因为这个函数返回的是局部变量的地址,当调用这个函数后,这个局部变量str就释放了,所以返回的结果是不确定的且不安全,随时都有被收回的可能。
二、
int arr[] = {1, 2, 3, 4, 5, 6, 7, 8}; int *p = arr; *(p++) += 123; printf("%d, %d\n", *p, *(++p));
第一行,定义数组arr,元素共八个
第二行,定义指针p指向arr数组
此时的*p还是等于arr数组的第0个元素,也就是1
第三行,p++里的++是最后才运算,所以先执行*p+=123,也就是arr的第0个元素被赋值为123
此时arr变成{123,2,3,4,5,6,7,8} ,然后是p++,此时*p已经是等于arr的第1个元素了,也就是2
第四行,在执行printf时,括号里的参数是从右往左的顺序进行读取的,也就是说先执行
*(++p),也就是p先加一再指针,指向的是arr第2个元素3,然后在执行*p,还是3。
最后显示的内容就是:
3,3
相关文章推荐
- js小练习:利用getElementsByTagName方法、for循环、this指针、数组实现对多个相同元素value值的改变
- 【C代码练习23】用指针寻找数组中的最大值和最小值
- 练习3: 通过打印指针,加深对交换函数和指针的理解。
- 练习指针
- 字符串中最长的连续出现的字符【指针练习】
- 《黑马程序员》 ★指针练习★ (C语言)
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用智能指针 用StrBlob代替vector<string> C++Primer 练习12.32
- C和指针第一章编程练习
- C++文本查询程序 定义类管理数据 用智能指针 C++Primer练习12.30
- C++文本查询程序 定义类管理数据 用引用共享数据 不用智能指针 C++Primer练习12.27
- C和指针之数组编程练习5 (矩阵相乘)
- [技术指针]今日关键词:企业搜索
- c++笔记03---构造函数,初始化表,文件分类,钟表练习,析构函数,this 指针
- 指针练习一
- 指针练习三
- c和指针练习
- C和指针 练习 1-4
- C和指针之动态内存分配之编程练习3