打印

指针如何去理解

[复制链接]
楼主: zhanghqi
手机看帖
扫描二维码
随时随地手机跟帖
21
kkzz| | 2017-5-24 20:51 | 只看该作者 回帖奖励 |倒序浏览
每次调用来调用去,一复杂就晕了

使用特权

评论回复
22
gygp| | 2017-5-24 20:52 | 只看该作者
看书上的例子都看不懂,如何是好。

使用特权

评论回复
23
51xlf| | 2017-5-24 20:52 | 只看该作者
如何通过指针来修改指向地址中的值

使用特权

评论回复
24
wangdezhi| | 2017-5-24 20:52 | 只看该作者
根据需要分配不同的内存大小

使用特权

评论回复
25
minzisc| | 2017-5-24 20:53 | 只看该作者
指针是一个特殊的变量

使用特权

评论回复
26
1988020566| | 2017-5-24 20:54 | 只看该作者
如何完全理解一个复杂类型

使用特权

评论回复
27
kkzz| | 2017-5-24 20:54 | 只看该作者
程序就搞不懂了。

使用特权

评论回复
28
gygp| | 2017-5-24 20:54 | 只看该作者
如何调用 一个函数修改函数外的变量?

使用特权

评论回复
29
51xlf| | 2017-5-24 20:54 | 只看该作者
指针可以实现动态的程序执行

使用特权

评论回复
30
wangdezhi| | 2017-5-24 20:54 | 只看该作者
感觉指针不得不认真学

使用特权

评论回复
31
minzisc| | 2017-5-24 20:54 | 只看该作者
指针是C语言的难点和重点,但指针也是C语言的灵魂

使用特权

评论回复
32
1988020566| | 2017-5-24 20:54 | 只看该作者
动态内存分配,没有指针是无法执行的。

使用特权

评论回复
33
wuhany| | 2017-5-24 22:18 | 只看该作者

指针就是地址,对每一个存储变量的位置直接进行操作,有的时候可以提高效率,当然是在没有把自己绕进去的前提下。

使用特权

评论回复
34
jiahy| | 2017-5-24 22:20 | 只看该作者
今天花了点时间把指针重新搞了搞  基本搞通了   说穿了   指针本身是一个特殊的容器,C语言中,普通的容器用于存放你赋予该变量的数值(其实没这么简单   你就这样理解)  

使用特权

评论回复
35
jiahy| | 2017-5-24 22:29 | 只看该作者
而指针这个特殊的容器用于存放某个变量的地址   当用的时候   只需要调用该指针就可以了   指针实质上通过存储的变量的地址调用你赋予变量的数值   希望你能理解   呵呵

使用特权

评论回复
36
jiahy| | 2017-5-24 22:31 | 只看该作者
看书,再看一个经常使用到指针的具体项目的实际软件源代码,有疑问的地方再对照书,再加上网上论坛之类的咨询

使用特权

评论回复
37
zhenykun| | 2017-5-24 22:33 | 只看该作者
买本书,网上找点资料,很容易啊。老是求别人经验,就没有抄近道的路。楼主靠自己慢慢学,难道还学不会?

使用特权

评论回复
38
jiahy| | 2017-5-24 22:36 | 只看该作者

0. 一般人觉得指针难学因为在学指针前还没把表达式和变量的概念搞清楚。

1. 指针变量保存的是内存地址。用指针访问数据也称为间接寻址。类似于你找一个人,他住在“第一大院”。你直接去找第一大院就是直接寻址。如果他的住址只有一个住在“第五大院”的人知道,你去第五大院问出他家在第一大院这就是间接寻址。

1.+ 对于上面这种情况,如果我们认为第五大院是“知道他家住址的那个人的住址”,我们就可以进行一连串的间接寻址。另一方面也说明指针变量保存的地址也是数据的一种。

2. 指针变量的类型。指针变量的类型目的*仅仅*在于减少编程中可能发生的错误。这一点必须明确。根本上说指针变量的类型就是地址。我们为了避免不必要的错误强行加上了“只能保存整数的地址”之类的约束。好比住在第五大院的人只会去记中年人的地址。

3. 指针的操作。
3.0 声明:类型A的指针的类型写作 类型A* 比如int*。与此同时int*本身也是类型,我们可以写int**。就是int的指针的指针。
3.1 获取地址,对于内存变量表达式 &运算符可以获得其地址,类型是表达是类型的指针。比如对于变量int a。&a获得的就是类型是int *的a的地址。
3.2 重定向,对于指针变量或者指针变量表达式。*运算符可以获得其指向地址的变量,类型是原指针的上一级。对于int a; int* p = &a; *p等价于a,类型是int。因为*p是变量,我们可以进行x = *p(取值)和*p = 0(赋值)操作。
3.3 &和*都可以对变量表达式进行操作。比如数组int a[10]。我们可以通过&a[5]获得a第5个元素的地址。又如int** a。*a是一个int*类型的变量,我们可以进一步地**a获得类型是int的变量,这就是从第六大院的人口中问出知道A君住址的人在第五大院,然后再去第五大院问出A君住在第一大院的过程。

4. 数组和指针的混合。这个可以说是C/C++语法的bug...
int* a[4] 这个类型可以看成(int*)[4] 元素是int*类型,有4个元素
int (*a)[4] 这个其实是(int[4])* 指向int[4]类型变量的指针。

4.+ 数组变量其实也是指针。int b[4]; 变量b在多数情况下就是一个const int*,指向数组b所占用的内存,也就是数组b的第一个元素。*b和b[0]是等价的。对于int *a;我们可以直接进行a = b的操作,让指向数组b。

5. 指针的加法。对于int *a;我们可以进行a + N, a - N的运算。a + 1指向a指向的元素的下一个元素,相应的a - 1指向上一个元素,以此类推。于是*(a + 1)就对a指向的下一个元素进行重定向,等价于数组运算a[1]。

5.+ 对于int *a, *b; a - b获得的是b到a之间相差多少个元素,类型是int。比如 int x[5]; int *a = &x[0], *b = &x[3]; b - a的结果是3。相应的a - b的结果是-3。

这些大体概括了指针的基本内容,可能有疏漏,指针的应用就是指针的基本操作和其他表达式、变量操作的配合。

使用特权

评论回复
39
zhanghqi|  楼主 | 2017-5-24 22:39 | 只看该作者
嗯,我再好好缕一缕吧,有了好消息及时通知大家,结贴喽

使用特权

评论回复
40
Brand2| | 2017-5-25 20:00 | 只看该作者
指针是定位地址的一种变量

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则