关于指针的思考
来源:互联网 发布:linux jdk 7u80 编辑:程序博客网 时间:2024/05/15 04:27
前两天在网上看了一道关于指针的题,对于我这种,看到指针就蒙圈的人来说,挺有意思,下面就这道题,咱好好看看。
#include <stdio.h>
void
f(
char
**p){
*p +=
2
;
}
main()
{
char
*a[] = {
"123"
,
"abc"
,
"456"
},**p;
p = a;
f(p);
printf(
"%s\r\n"
,*p);
}
我一开始写的是456,但其实是3
在VS上运行了下,确实是3,这是为啥呢?
char *a[] 表示的是一组指针数组,每个元素是char类型指针。也就是说,数组里面指向的是一系列指针的地址,而不是字符的地址;
char **p 表示指向指针的指针,其实跟*a[]是一样的,你可以认为 **p=*a[];
首先,a[0]指向的是第一个字符串的第一个字符,
a[1]指向的是第二个字符串的第一个字符,
a[2]指向的是第三个字符串的第一个字符,
既然*a[]=**p,那么a[]=*p,
再往下,a=p,而a指向的为第一个字符串的第一个字符, 所以,p指向的为第一个字符串的第一个字符,
再看,a+2=a[1],也就是说,*(p+2)=a[2] 也就是456
那为啥*p+=2 最后出来的是3呢?
看下面
a[0] a[1] a[2]
m g n k
1 2 3 \0 a b c \0 4 5 6 \0
a[0],a[1],a[2] 里面分别存的是指向 1、a、4的指针m、n、k,
a[0]++肯定是a[1],这没毛病, p=a,那p++,*p=a[1]也没毛病;
但是!!!!
*p指向的是m,所以,如果是*p=*p+1,那就是m++,即g的位置;
如果是p++,那就是n的位置,
注意啊,这里 *p++与*p=*p+1不同,*p++=*(p++)=*(p+1)!=*p+1这点要切记!
最后 记住这个 i=*p++意思就是先取值后+1! 经常容易混了。
- 关于指针的思考
- 关于空指针的思考
- 关于指针的一点思考
- 关于this指针的思考
- 关于迭代器(iterator)和指针的思考
- 关于迭代器(iterator)和指针的思考
- 关于指针强制类型转换的思考
- 关于指针强制类型转换的思考
- 关于迭代器(iterator)和指针的思考
- 关于指针和数组的一些思考
- 关于指针强制转换的思考
- 关于指针,地址总线的一些思考。
- c语言关于指针的思考
- 关于内存,指针的一点思考
- 关于指针初始化的一些思考
- 关于指针和引用的思考
- 关于指针的思考与理解
- 关于指针类型转换的思考
- jQuery 增加 删除 修改select option
- VM(虚拟机安装win7 提示 :units specified don't exist, SHSUCDX can't install)解决方法
- main函数和参数
- scala基础5-函数进阶
- php如何截取中英文字符串
- 关于指针的思考
- 深度学习有哪些好玩的且易于实现的论文?
- phpstorm配置Xdebug进行调试PHP教程
- IOS图片拉伸的几种方式
- Yii2基础:数据库的增删改查操作
- Yii2.0基础: 对数据库 查询的一些简单的操作
- 解决:Reading table information for completion of table and column names
- hdu 1231 最大连续子序列 DP
- Yii2.0页面提示消息