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

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

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



void CDlgTestDlg::test(TCHAR* pChar) 

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

TCHAR* arr="1";
指针arr指向常量字符串"1",常量字符的内容是不能改变的,此时相当于定义了一个const TCHAR *arr = "1";
如要改变其值,arr[0]="2",此时编译不会报错,但程序运行时会警告Written某块内存区域失败。
指向常量的指针,我们不能改变其内容,却可以让它指向另外的内存空间,如:
TCHAR *arr1="1";
TCHAR *arr2="2";
arr2 = arr1;
此时arr2与arr1指向了同一块内存空间,这块内存空间的内容是"2",楼主用形参的形式改变输入值,此时就要用到指针或者引用才能改变,原来的值本身就是一个指针,此时就需要用到指向指针的指针了。
另外要注意数组与指针的区别:
C++/C 程序中,指针和数组在不少地方可以相互替换着用,让人产生一种错觉,以
为两者是等价的。
数组要么在静态存储区被创建(如全局数组),要么在栈上被创建。数组名对应着
(而不是指向)一块内存,其地址与容量在生命期内保持不变,只有数组的内容可以改
变。
指针可以随时指向任意类型的内存块,它的特征是“可变”,所以我们常用指针来
操作动态内存。

------解决方案--------------------
实现的方法可以有多种,大致介绍一下原理,欢迎探讨:
方法一:实质是通过指针,逐个修改数组中的内容(记住是修改数组中的内容,而指向常量的指针的内容是不可以更改的)
#include "iostream"
using namespace std;

void modifyString(char* pString)
{
strcpy(pString,"linux");
//实质是*pString = 'l'; pString++; *pString = 'i'; pString++; .......
cout<<&pString<<":"<<pString<<endl;
}

void main()
{
char arr[10]="windows";
modifyString(arr);
cout<<&arr<<":"<<arr<<endl;//运用结束后arr中的内容实际是"linux\0s\0\0\0",数组中的s还在,只是没有打印出来

方法二:通过引用生成pchar的别名pString,pString更改了,pchar也就更改了
#include "iostream"
using namespace std;

void modifyString(char*& pString)
{
//strcpy(pString,"linux");
pString="linux";
cout<<&pString<<":"<<pString<<endl;
}

void main()
{
char* pChar="windows";
modifyString(pChar);
cout<<&pChar<<":"<<pChar<<endl;
}
方法三:通过指针的指针更改,pString指向pChar的地址,pString和pChar最终指向同一块内存空间
#include "iostream"
using namespace std;

void modifyString(char **pString)
{
//strcpy(pString,"linux");
*pString="linux";
cout<<&pString<<":"<<pString<<endl;
}

void main()
{
char *pChar="windows";
modifyString(&pChar);
cout<<&pChar<<":"<<pChar<<endl;
}

------解决方案--------------------
include "iostream"
using namespace std;
void modifyString(char*& pString) [color=#FF0000]//此处的形参的意思是:引用一个char类型的指针。
{
//strcpy(pString,"linux");
pString="linux";
cout<<&pString<<":"<<pString<<endl;
}

void main()
{
char* pChar="windows";
modifyString(pChar);//此处给的实参类型与函数声明中的形参类型相符。
cout<<&pChar<<":"<<pChar<<endl;
}

此方法也是可以的,但如何把pChar改成数组呢? 

include "iostream"
using namespace std;

void modifyString(char*& pString)//此处的形参的意思是:引用一个char类型的指针。
{
//strcpy(pString,"linux");
pString="linux";
cout<<&pString<<":"<<pString<<endl;
}

void main()
{
char pChar[10]="windows";
modifyString(pChar); //此处给的实参类型与函数声明中的形参类型不符。
//应该改为:modifyString((char*)pChar);以强
//制将pChar所指向的地址改为char类型的指针。
cout<<&pChar<<":"<<pChar<<endl;
}
这样就不行了, 
cannot convert parameter 1 from 'char [10]' to 'char *& '[/color]

文章评论

每天工作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 版权所有