| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1131 人关注过本帖
标题:菜芽 学C之我见三——指针(1)
只看楼主 加入收藏
豆芽小球
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2011-10-14
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:16 
菜芽 学C之我见三——指针(1)
  首先要明确,一个变量在被编译的时候会根据其类型分配一定的长度, 而内存的每一个单元都有唯一的编号与之对应。比如:int 型分配二个字节,在内存中划出二个单元,这二个单元地址是 2000~2001。  

指针:      其实就是一个 变量 的 实际 首地址 这里指针指的是 2000 。。。

指针变量:  专门存储指针的变量(也就是某一个具体变量实际地址的首地址)。。。
 
* :这个标号可以读作“指向”。。。比如:一个已经定义的变量 P ,*p 就是 指向 指针变量P所对应的变量
       int i;
       int *p;(定义p是一个指针变量)
       p = &i;(&,是取地址符号)
那么这段话的意思就是,我先定义一个整型变量i, 再定义一个指针变量p(用来专门存储变量i首地址的变量),然后再将i的首地址取出来(&i)赋值给指针变量p。经过这三条语句后,在输入\输出时调用 *p,此时 *p就指向变量i的内容。

一:为什么定义指针变量的时候要 加 基类型?
    首先, 是变量就要先定义后使用;其次就是不同类型的变量长度不一样,这个时候要保证指针变量长度和变量长度一样,才方便进行指针运算。

二:指针变量做函数参数 与 “单向传送”的“值传递”方式的区别。
    一开始不太明白什么是参数变化实参不变化,还是参数变化实参发生变化。
   
  1、注意,指针做函数参数时候 声明的时候前加 void 也就是不需要返回值,那么我主调函数要想得到被调函数的结果的时候要怎么办呢? 对,就是要想办法通过参数值的改变来影响实参的值,这样在输出的时候,就会得到你想要的结果。(书上原话:指针变量指向的变量值发生变化,函数在调用结束后,这些变量值的变化依然保留)。
   
  2、“单向传送”的“值传递”; 在函数调用时,有时会要求返回一个值,这时将实参传递给形参,在通过被调函数的函数体得到一个值,用return语句传回主调函数,再输出返回值,但是实参的值没有发生变化。

三:注意的地方
 void change(int *p, int *q)
{
int t;//用 t 而不是用 *t, 因为*p 或者 *q 表示的就是一个具体变量的内容。无需在定义一个指针变量。 进行值交换
t = *p;
*p = *q;
*q = t;
}   
搜索更多相关主题的帖子: 内存 
2011-10-19 15:03
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:3 
把指针想象为鼠标模型,更好理解一些。

授人以渔,不授人以鱼。
2011-10-19 15:26
豆芽小球
Rank: 1
等 级:新手上路
帖 子:23
专家分:9
注 册:2011-10-14
收藏
得分:0 
回复 2楼 TonyDeng
能具体说下下嘛,想象成鼠标模型……
2011-10-19 15:31
单贴警告
Rank: 2
等 级:禁止发言
帖 子:15
专家分:62
注 册:2011-10-12
收藏
得分:3 
提示: 作者被禁止或删除 内容自动屏蔽

单贴警告桑不起!!!莫装B
2011-10-19 15:46
A13433758072
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:广东潮州
等 级:小飞侠
威 望:1
帖 子:1182
专家分:2784
注 册:2010-7-22
收藏
得分:3 
指针 是个 特殊的变量,特殊就在于它只能存放地址。。。。。。。。你 把一个变量直接赋值给它是 不 行的(int i; int *p=i是错误的 )


指针是地址这句,就太片面了,因为指针的值才是地址......什么情况下指针才能说是地址呢??只有void *p;
空指针
   才能叫指针是地址  因为 它没 指向任何实际地址

一步一个脚印...............................默默地前进.....
诚邀乐于解答c菜鸟问题,的热心网友加入,  QQ群38490319
2011-10-19 15:56
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
指针,犹如鼠标那个光标,是可以指向任意地方的,但问题不在于指向,而是指向之后要做什么动作。比如,在一个网页中,鼠标指向链接和普通文字,是不同的,当它指向链接时,有某个信息告诉程序,这里可以进行点击动作,于是把鼠标光标变为一只手,离开时恢复原来的箭头,指向普通文字时没有这样的动作。也就是说,要让通过鼠标指示的程序模块知道鼠标指向了什么、可以做什么、如何做。

指针本质上可以指向任何地址,但这个地址作什么用途,是程序事先约定的。我们约定写int *p这样的形式,是已经作了如下约定:1.指针指向的地址,是储存一个int数据的开始位置;2.int占多大,由int的规定得出,那么,指针的“长度”就是这个int的长度,它规定了p+1跃进的步幅(比如文字编辑器中左右一格都是按实际字符尺寸算的,而不是按像素算的);3.如果要从指针的指示位置读写数据,每次以int为单位,通过*p解除指针地址而操纵所指向的数据本身。

正是指针本质上是可以任意指向的(如乱晃鼠标),所以它天生具有野指针的本质,关键是如何规范地使用它。指标和鼠标一样,是一个中介的、间接的概念,我们阅读表格时,手指所指向的单元格里面的内容才是真正的数据,单元格不会乱跑,但手指(指针)可以乱指,得到什么或写入什么,取决于手指是否指向所希望的地方。

通过指针交换数据的操作,不过是借指针作一个“取物袋”,指向x时把x的数据复制到袋(中间变量)中,然后把指针移到y处,把数据写入y的同时把y原先的数据提取出来,再回到x处刷新x的值。不错,函数形参得到的指针,是复制实参指针的值(复制地址),在函数内部交换指针,就等于交换两个地址,此时对指针解引用的写操作,却是写到指针所指向的实体的。

授人以渔,不授人以鱼。
2011-10-19 16:00
讯草
Rank: 2
等 级:论坛游民
帖 子:26
专家分:55
注 册:2011-10-19
收藏
得分:3 
可不可以这样说了,指针指的是地址,但他显示的是这个地址的内容?~~
2011-10-19 16:36
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
回复 7楼 讯草
用*p操作符提取的才是内容。指针有两个脸孔,p和*p,两个脸孔很容易让人搞混的。

授人以渔,不授人以鱼。
2011-10-19 16:44
tangconghui
Rank: 1
等 级:新手上路
帖 子:10
专家分:6
注 册:2011-10-17
收藏
得分:3 
学了单片机原理可能容易理解一点……
2011-10-19 17:32
编程的乐趣
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:229
专家分:1027
注 册:2011-4-4
收藏
得分:3 
2011-10-19 17:33
快速回复:菜芽 学C之我见三——指针(1)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016895 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved