const char *与char *转换的本质
来源:互联网 发布:mac开机显示客人用户 编辑:程序博客网 时间:2024/06/04 12:44
BYTE bArray[16];
CHAR *cArray[17] ;
//BYTE 转 Char *
_tcscpy( cArray , (CHAR *)bArray);
vg
//CString to unsigned char* 非UNICODE情况下
unsigned char uncArray[16] ;
CString s = _T("ABCD") ;
_tcscpy( (CHAR*)uncArray , s );
unsigned char * to const char *
分两步转:
unsigned char* s;
const char* p = (const char*)(char*)s;
C函数形参里面为何要用:const char *inputString
[此问题的推荐答案]
保护实参指针指向的数据不被意外改写。
const char *inputString;//定义指向常量的指针
指针本身地址值可以增减,也可以给指针更换指向的常量,但是指向的内容有常量性质,指向的内容不能被更改。即:
inputString++;//这是可以的。
(*inputString)++;//这是禁止的。
强制类型转换的实质是告诉编译器,"这可行, 这行的通... 至于程序会不会出错, 编译器则不管, 因为你都说可行了."
两个操作数都是指向有限定符或无限定符的相容类型的指针,左边指针所指向的类型必须具有右边指针所指向类型的全部限定符。
正是这个条件,使得函数调用中实参char *能够与形参const char *匹配(在C标准库中,所有的字符串处理函数就是这样的)。它之所以合法,是因为在下面的代码中:
char *cp;
const char *ccp;
ccp=cp;
左操作数是一个指向有const限定符的char的指针。
右操作数是一个指向没有限定符的char的指针。
char类型与char类型是相容的,左操作数所指向的类型具有右操作数所指向类型的限定符(无),再加上自身的限定符(const)。
注意,反过来就不能进行赋值。如果不信,试试下面的代码:
cp=ccp; /*结果产生编译警告*/
最近在论坛上看到有一篇帖子提问下面的问题:
char * fun(char *p)
{
return p;
}
提问:此函数返回的是谁的值,是参数p的地址,还是p的值?
回答:
************************************************************
----------------
p的值,但其值指向一个内存地址
----------------
p是栈中的地址,和局部变量的地址一样,函数返回后这块内存就无效了。
----------------
这种用法还是很常见的,比如链表中。
虽然p是栈中的地址,但是因为它只是指针副本,所以可以改变指针的指向,指向其他地方。
----------------
************************************************************
记得在学习C语言函数那部分的时候,有一个很重要的概念是区别:值传递、指针传递、引用传值(好像是这三种说法)。
我觉得要理解这部分知识点,首先应该知道不同种类的变量在内存中是如何分配存储的,它们的生命周期多长等这些问题,然后在理解哪三种情况就好理解了。函数的参数一般都
是在stack栈上分配的,所以它的生命周期就在它所属的函数内,函数执行完毕的时候,它的内存将被回收。
如果我们想在函数内对实际参数进行操作(不是对形式参数的副本)的话,一般会使用引用,即声明函数的形式参数为引用类型,比如char * fun(char * &p),这样实参和形参为同
一个变量,我们在函数中操作形参p就等于直接在操作实参变量。我看C++语法书的时候,书上说这样用还有一个好处是,在调用函数的时候,不用再为形式参数分配内存了,这样
执行效率会高一点儿。
下面是函数形参为指针的几种情况:
#include <iostream>
using namespace std;
char* func1(char *p);
void func2(char *p);
void func3(char * &p);
char s1[]="原来的";
char s2[]="指向我了吗";
int main()
{
char *ptr=s1;
cout<<ptr<<endl;
ptr=func1(ptr); //返回值改变ptr使它指向另一个地址
//func2(ptr); //ptr的指向没有改变,func2函数中改变的只是它的副本(一个局部变量)
//func3(ptr); //改变了ptr的指向,func3函数的形式参数为引用类型,实参和形参是同一个变量
cout<<ptr<<endl;
return 0;
}
char* func1(char *p)
{
p=s2;
return p;
}
void func2(char *p)
{
p=s2;
}
void func3(char * &p)
{
p=s2;
}
- const char *与char *转换的本质
- const char *与char *转换的本质
- char ** 与const char **的转换
- string 与char*,const char*, char[]之间的转换
- string 与char* 、char[]、const char*之间的转换
- const char *|char const char * 与char * const 的区别
- CString const char*与char*之间的转换关系
- CString与char*,const char* 的相互转换问题
- CString const char*与char*之间的转换关系
- CString与char*,const char* 的相互转换问题
- CString与char*,const char* 的相互转换
- CString const char*与char*之间的转换关系
- CString const char*与char*之间的转换关系
- CString const char*与char*之间的转换关系
- LPCTSTR与const char*之间的转换
- CString与const char*的相互转换
- const char*, char const*, char*const的区别与记忆
- const char *与char * const的区别
- 七上八下的生活
- Codeforces Round #297 (Div. 2) D题. Arthur and Walls(BFS)
- windows 7 Oracle 11g安装图解(详细)
- Rand以后每个国家Sample50个记录
- 线段树区间求最大值
- const char *与char *转换的本质
- Java学习笔记_IO
- Ubuntu 14.04 系统托盘图标 无法显示QQ 图标问题,RTX 托盘图标
- 【SICP归纳】6 副作用与环境模型
- URAL 1506. Columns of Numbers(模拟啊 )
- 【java】反射
- Poco logger 日志使用小析
- nyoj 7 街区最短路径问题
- Unity3D中写入SQL数据库抛出InvalidProgramException解决过程