MyException - 我的异常网
当前位置:我的异常网» VC/MFC » 有关指针变量传递的有关问题

有关指针变量传递的有关问题(3)

www.MyException.Cn  网友分享于:2013-03-10  浏览:28次


这样当然不行了呀。
在定义void modifyString(char*& pString)中,形参的意思是:引用一个char类型的指针。在第一段代码中,调用的时候,给的实参是一个char类型的指针,所以没有出错的。而在第二段代码中,在调用的时候,给的却是一个char类型的数组,当然就会出错了。
------解决方案--------------------
探讨
引用的本质是什么?!

------解决方案--------------------
我想楼主是没理解指针变量存储的地址,与指针变量自身的关系.

例如char *p = "windows" , 我编译一下,得到: mov dword ptr[ebp-14h],offset string "windows" (416710h)

意思是把"windows"这个字符串的地址,这里即0x00416710h 放到ebp-14(例如:0X0012ff54,即p变量里面) ebp-14 是一个栈地址,即&p = ebp-14 

所以p是一个栈变量,它位于从0x0012ff54 地址开始的4个字节里. 这4个字节里面存放的是0x00416710h , 而从地址0x00416710h开始的8个字节里面,放的分别是'w','i',...'s',0 等字符的ASCII码, 第8个字节存放0,表示字符串结束.

而 char p ='a' 呢?假设p 还是在0x0012ff54 这个地址,没错,这个地址存放的是a的ASCII码. 

char p[] = " windows" 呢? 假设p 还是在0x0012ff54 这个地址,那么从这个地址开始的8个字节存放的是"windows"的的ASCII码. 




------解决方案--------------------
引用#include "iostream"
using namespace std;
void modifyString(char* pString) {
strcpy(pString,"linux");//这里pString的值就是arr的值,也就是"windows"的开始地址
cout < <&pString < <":" < <pString < <endl;
}
void main() {
char arr[10]="windows";
modifyString(arr);//这里传递的arr是个地址,也就是“windows”的开始地址
cout < <&arr < <":" < <arr < <endl;
}
"此方案的确可行,可是为什么pString,arr的地址不同,同样也可以达到外部修改的目的??"
调试看看,pString,arr的地址应该是相同的

------解决方案--------------------
回复太多了,没看大家的回复。

void CDlgTestDlg::test(TCHAR* pChar)
函数的参数是传递一个指针值,函数里面修改pChar的值(指针),都只是对形参的修改,函数返回后形参就自动释放了,不会影响到调用者。如果是修改指针指向的数据,才会影响到调用者。

另外如果把函数定义修改一下,改为:
void CDlgTestDlg::test(TCHAR*& pChar)
这时函数的参数是引用传递,函数中对pChar的修改就会带回给调用者了。
------解决方案--------------------
数组实际上指代实体是一种结构,而指针是一个存储地址的变量。
数组首地址,是其所指代结构的入口地址,且是指针常量,不可以进行指针运算。
在函数参数中传递数组名,在函数内部会完全转化为指针,可以进行指针运算。
呵呵,向大家学习了!
------解决方案--------------------
引用楼主 ismycxp 的帖子:
void CDlgTestDlg::OnButton1()
{
TCHAR* arr="1";
test(arr);
MessageBox(arr); //弹出1
}

void CDlgTestDlg::test(TCHAR* pChar)
{
pChar="2"; //这里修改了值
MessageBox(pChar); //弹出2,已经修改了值,它传递的是地址啊,为什么上面还是弹出1呢?
}

------解决方案--------------------

楼上的说法不够准确,一个常量指针是不能赋给变量指针。OnButton1函数中的第一个行代码,只不过定义了一个TCHAR指针,然后向这个指址指向的内容以"1"来填充。编译器对代码进行了优化,把它看成是const char指针。
因为arr并不是严格意义上的常量指针,所以可以将它传给函数test.在参数传递过程中,产生了如下代码:
TCHAR* pChar=arr; //指针pChar是一个局部值,它不是arr的别名。
pChar="2" //修改了pChar的地址,而函数外的arr的内容没有修改,这么一来pChar将是一个全新地址。
MessageBox(pChar); //这时pChar将显示出局部指针指向的内容。

为了看到改变的字符串内容,函数可以这么设计:
void test(TCHAR* pChar) 


pChar[0]=_T('2');
//也可以写成_tcscpy(pChar,_T("2"));
MessageBox(NULL,pChar,NULL,MB_OK);


void OnButton1() 

TCHAR arr[10]; 
_tcscpy(arr,_T("1"));
test(arr); 
MessageBox(NULL,arr,NULL,MB_OK);

因为语句_tcscpy(pChar,_T("2"));和pChar[0]=_T('2');
并没有对地址进行改变,所以OnButton1中的消息框显示出2.
这也就是为什么不能把一个字符串常量赋给一个字符串数组,因为字符串数组在它定义时地址已经确定,而且不会改变,给它赋予常理意味着要修改字符串地址。

或者设计一个含二级指针的函数:
void test(TCHAR** pChar) 


*pChar=_T("2");

文章评论

每天工作4小时的程序员
每天工作4小时的程序员
Java 与 .NET 的平台发展之争
Java 与 .NET 的平台发展之争
如何成为一名黑客
如何成为一名黑客
10个调试和排错的小建议
10个调试和排错的小建议
写给自己也写给你 自己到底该何去何从
写给自己也写给你 自己到底该何去何从
为啥Android手机总会越用越慢?
为啥Android手机总会越用越慢?
编程语言是女人
编程语言是女人
团队中“技术大拿”并非越多越好
团队中“技术大拿”并非越多越好
Web开发者需具备的8个好习惯
Web开发者需具备的8个好习惯
漫画:程序员的工作
漫画:程序员的工作
10个帮程序员减压放松的网站
10个帮程序员减压放松的网站
如何区分一个程序员是“老手“还是“新手“?
如何区分一个程序员是“老手“还是“新手“?
我跳槽是因为他们的显示器更大
我跳槽是因为他们的显示器更大
亲爱的项目经理,我恨你
亲爱的项目经理,我恨你
60个开发者不容错过的免费资源库
60个开发者不容错过的免费资源库
一个程序员的时间管理
一个程序员的时间管理
那些争议最大的编程观点
那些争议最大的编程观点
当下全球最炙手可热的八位少年创业者
当下全球最炙手可热的八位少年创业者
老程序员的下场
老程序员的下场
程序员周末都喜欢做什么?
程序员周末都喜欢做什么?
中美印日四国程序员比较
中美印日四国程序员比较
 程序员的样子
程序员的样子
要嫁就嫁程序猿—钱多话少死的早
要嫁就嫁程序猿—钱多话少死的早
为什么程序员都是夜猫子
为什么程序员都是夜猫子
Web开发人员为什么越来越懒了?
Web开发人员为什么越来越懒了?
程序员和编码员之间的区别
程序员和编码员之间的区别
“肮脏的”IT工作排行榜
“肮脏的”IT工作排行榜
聊聊HTTPS和SSL/TLS协议
聊聊HTTPS和SSL/TLS协议
程序员应该关注的一些事儿
程序员应该关注的一些事儿
程序员眼里IE浏览器是什么样的
程序员眼里IE浏览器是什么样的
鲜为人知的编程真相
鲜为人知的编程真相
做程序猿的老婆应该注意的一些事情
做程序猿的老婆应该注意的一些事情
程序员最害怕的5件事 你中招了吗?
程序员最害怕的5件事 你中招了吗?
程序猿的崛起——Growth Hacker
程序猿的崛起——Growth Hacker
“懒”出效率是程序员的美德
“懒”出效率是程序员的美德
5款最佳正则表达式编辑调试器
5款最佳正则表达式编辑调试器
十大编程算法助程序员走上高手之路
十大编程算法助程序员走上高手之路
程序员的鄙视链
程序员的鄙视链
看13位CEO、创始人和高管如何提高工作效率
看13位CEO、创始人和高管如何提高工作效率
什么才是优秀的用户界面设计
什么才是优秀的用户界面设计
旅行,写作,编程
旅行,写作,编程
不懂技术不要对懂技术的人说这很容易实现
不懂技术不要对懂技术的人说这很容易实现
初级 vs 高级开发者 哪个性价比更高?
初级 vs 高级开发者 哪个性价比更高?
程序员的一天:一寸光阴一寸金
程序员的一天:一寸光阴一寸金
程序员必看的十大电影
程序员必看的十大电影
软件开发程序错误异常ExceptionCopyright © 2009-2015 MyException 版权所有