首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

关于指针的使用解决思路

2013-10-22 
关于指针的使用新手求解[解决办法]看来楼主没有明白指针的含义,指针是在内存分配一块区域,比如 int a2in

关于指针的使用

新手求解                                                                            
[解决办法]
看来楼主没有明白指针的含义,指针是在内存分配一块区域,
比如 
int a=2;
int *P=&a;
P这个指针里储存的并不是a的值(int 2),而是a的内存地址(比如0xfff000)
另一个概念就是局部函数,当你调用 max()这个函数时,函数体内的数值会进行运算,但局部函数会在这个函数结束后随之消失,但如果你在调用max()时,写成 max(&a,&b,&c)  ,当a,b,c在max函数体内运算时,内存的地址会被改变,所以数值也就会改变。
[解决办法]
你的函数形是这样定义的!这样也能达到值的修改的目的!
看看这本书
c和指针
[解决办法]
楼主,你max中的函数是void max(int *a,int *b,int *c)样子的,int *的类型就是返回一个指向int型的指针,如果你难以理解的话,就把(int *)看成个整体,这就是个指针类型,相当于其他的float型啊double型啊,一样的,所以根据你的函数定义,你是要传递的参数类型是指向a,b,c的指针也就是(int*型), 也就是a,b,c的地址,所以你在函数中要用到取地址符&,如果你就把a,b,c三个参数传进去的话,比如说a=1,b=2,c=3,那么你相当于是在函数中用的是以存在1(or2or3)这个地址下的数据。
[解决办法]
你max函数的形参是指针,那调用的时候必需也是传指针进去啊
a->变量
&a->取地址符,也就是a的地址,是指针
[解决办法]
要的是地址 传数值进去肯定不行
[解决办法]
因为函数调用的参数类型要和定义保持一致,定义是一个指针,调用时就要传指针或变量的地址
[解决办法]
参数不匹配噻
[解决办法]
计算机组成原理→DOS命令→汇编语言→C语言(不包括C++)、代码书写规范→数据结构、编译原理、操作系统→计算机网络、数据库原理、正则表达式→其它语言(包括C++)、架构……

对学习编程者的忠告:
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!

VC调试时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
对VC来说,所谓‘调试时’就是编译连接通过以后,按F10或F11键单步执行一步以后的时候,或者在某行按F9设了断点后按F5执行停在该断点处的时候。
(Turbo C或Borland C用Turbo Debugger调试,Linux或Unix下用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)

想要从本质上理解C指针,必须学习汇编以及C和汇编的对应关系。
从汇编的角度理解和学习C语言的指针,原本看似复杂的东西就会变得非常简单!
指针即地址。“地址又是啥?”“只能从汇编语言和计算机组成原理的角度去解释了。”
但我又不得不承认:
 有那么些人喜欢或者适合用“先具体再抽象”的方法学习和理解复杂事物;
 而另一些人喜欢或者适合用“先抽象再具体”的方法学习和理解复杂事物。
而我本人属前者。

这辈子不看内存地址和内存值;只画链表、指针示意图,画堆栈示意图,画各种示意图,甚至自己没画过而只看过书上的图……能从本质上理解指针、理解函数参数传递吗?本人深表怀疑!
这辈子不种麦不收麦不将麦粒拿去磨面;只吃馒头、吃面条、吃面包、……甚至从没看过别人怎么蒸馒头,压面条,烤面包,……能从本质上理解面粉、理解面食吗?本人深表怀疑!!

提醒:
“学习用汇编语言写程序”

“VC调试(TC或BC用TD调试)时按Alt+8、Alt+7、Alt+6和Alt+5,打开汇编窗口、堆栈窗口、内存窗口和寄存器窗口看每句C对应的汇编、单步执行并观察相应堆栈、内存和寄存器变化,这样过一遍不就啥都明白了吗。
(Linux或Unix下可以在用GDB调试时,看每句C对应的汇编并单步执行观察相应内存和寄存器变化。)
想要从本质上理解C指针,必须学习C和汇编的对应关系。”
不是一回事!

不要迷信书、考题、老师、回帖;
要迷信CPU、编译器、调试器、运行结果。
并请结合“盲人摸太阳”和“驾船出海时一定只带一个指南针。”加以理解。
任何理论、权威、传说、真理、标准、解释、想象、知识……都比不上摆在眼前的事实!

有人说一套做一套,你相信他说的还是相信他做的?
其实严格来说这个世界上古往今来所有人都是说一套做一套,不是吗?

不要写连自己也预测不了结果的代码!

电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;
人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息……

十字链表交换任意两个节点C源代码(C指针应用终极挑战)http://download.csdn.net/detail/zhao4zhong1/5532495

[解决办法]
int a;
&a才是int *。
[解决办法]
这个程序是简单,但是可读性很差,还用中间变量,很麻烦!
至于为甚么写成&a因为你这里需要的是地址,你定义的时候为int就不用&了,当然函数里面也得修改。
如果你这里不用&a;假如
a = 1;b = 2;c = 3;
调用max(a,b,,c);怎么了?崩溃了吧!这个函数里面有*a什么之类的这是要访问低端内存啊,操作系统能允了?你的问题归根结底是没有了解清楚指针,所以好好看看指针吧!给你个简单的程序

int max(int a,int b,int c)
{
return ((a > b)?a:b) > c ?((a > b)?a:b):c;
}


[解决办法]
如果不懂的话看下下面
指针变量也是一种变量。所以在使用之前,必须先声明。声明指针变量的语句格式为:
    指针的类型 *指针变量名;
其中,指针类型应该是与指针所指向的数据相符合的数据类型。比如int、char、float等等。*表示所要定义的是一个指针变量,而不是一个普通变量。指针变量名则应该遵循起变量名的一切规则。
例如:
   char *cptr;//指向字符型变量的指针变量
   int *iptr;//指向整型变量的指针变量

要注意,当我们要声明多个指针变量时,必须在每个指针变量名前加上*,例如:
   int *iptr1,*iptr2,iptr3;//iptr1和iptr2是指向整型变量的指针变量,而iptr3是整型变量
获取地址和指针变量初始化
我们已经声明了指针变量,那么我们如何获得数据在内存中的地址呢?

在C++中,用&操作符可以获取变量或常量在内存中的地址,我们称之为取地址操作符。它的使用格式是:
    &变量名或常量名
既然能够获取到数据所在的地址,我们就能把这个地址交给指针了。例如:
    int c=9;
    int *iptr=&c;//声明指向整型变量的指针变量,并作初始化

这时,我们称指针iptr指向了变量c。在第三章我们说过,声明一个未经初始化的变量之后,它的值是无法确定的。所以如果声明了一个指针却不对它作初始化,那么它所指向的内容也是无法确定的,而这种情况是十分危险的。
特殊的值——NULL
没有初始化的指针变量是危险的。可是如果在声明变量之后,找不到合适的地址进行初始化,我们该怎么办呢?显然,随便找个地址对指针变量做初始化是不负责任的。
在这里,我们引入一个特殊的地址——NULL。它的意思是“空”,即指针没有指向任何东西。比如:
    int *iptr=NULL;
要注意的是,C++是大小写敏感的,NULL与null是不同的。所以,在使用的时候必须要大写。


指针的使用——间接引用
双击一个有效的快捷方式,就能够调用对应的文件,那么我们通过什么方法才能操作指针所指向的变量呢?
在这里,*又出现了,它称为间接引用操作符。其作用是获取指针所指向的变量或存储空间。间接引用的指针可以作为左值。(关于左值概念请参见第三章)具体的使用格式为:
    *指针变量名

下面,我们来看一段程序,实践一下如何使用指针变量:(程序8.2)
#include "iostream.h"
int main()
{
   int i=3;
   int *iptr=&i;
   int **iptrptr=&iptr;//iptr也是变量,也能够获取它的地址
   cout <<"Address of Var i=" <<iptr <<endl;//输出iptr存储的内容,即i在内存中的地址
   cout <<"Data of Var i=" <<*iptr <<endl;//输出iptr所指向的变量
   cout <<"Address of Pointer iptr=" <<iptrptr <<endl;//输出iptr在内存中的地址
   cout <<"Address of Var i=" <<*iptrptr <<endl;//输出iptrptr所指向的变量,即iptr
   *iptr=2+*iptr;//*iptr可以作左值
   cout <<"Data of Var i=" <<*iptr <<endl;
   return 0;
}

运行结果:
Address of Var i=0x0012FF7C
Data of Var i=3
Address of Pointer iptr=0x0012FF78
Address of Var i=0x0012FF7C
Data of Var i=5

通过运行结果,我们可以知道变量i在内存中的地址是0012FF7C(前面的0x表示这是一个十六进制的数);指针也是一种变量,在内存中也有地址;间接引用指针以后就和使用指针指向的变量一样方便。

热点排行