BYTE bArray[16];

CHAR *cArray[17] ;

//BYTE 转 Char *

_tcscpy( cArray , (CHAR *)bArray);

------------------------------------------------------------------------------

//CString   转  unsigned char*    --- 非UNICODE情况下

unsigned char uncArray[16] ;

CString s = _T("ABCD") ;

_tcscpy( (CHAR*)uncArray , s );

------------------------------------------------------------------------

unsigned char *  转  const char *

分两步转:

unsigned   char*   s;

const   char*   p   =   (const   char*)(char*)s;

----------------------------------------------------------------------------------------------------------------

C函数形参里面为何要用:const char *

[此问题的推荐答案]

保护实参指针指向的数据不被意外改写。

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

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=func1(ptr);      //返回值改变ptr使它指向另一个地址

//func2(ptr);   //ptr的指向没有改变,func2函数中改变的只是它的副本(一个局部变量)

//func3(ptr);   //改变了ptr的指向,func3函数的形式参数为引用类型,实参和形参是同一个变量

cout<

return 0;

}

char* func1(char *p)

{

p=s2;

return p;

}

void func2(char *p)

{

p=s2;

}

void func3(char * &p)

{

p=s2;

}

c语言const unsigned char,char * /const char */unsigned char * 转换相关推荐

  1. char* 赋值 const char* 释放_嵌入式Linux开发《C语言专题(十:彻底搞懂“关键字”const)》...

    C语言中的关键字总共有32个:auto break case char const continue default do double else enum extern float for goto ...

  2. 【错误记录】Android NDK 编译报错 ( no known conversion from ‘unsigned char *‘ to ‘const char *‘ )

    文章目录 一.报错信息 二.解决方案 一.报错信息 在 Visual Studio 2019 中编译 Android NDK , 构建方式参考 [Android 逆向]Android 进程注入工具开发 ...

  3. C语言---char *与const char *

    一.const char和char const char*的类型是:"指向一个具有const限定符的char类型的指针".(不能修改其值) char*的类型是:"指向一个 ...

  4. C语言编译时产生的警告:initializing ‘char *‘ with an expression of type ‘const char *‘ discards qualifiers

    警告的产生: char *my_strstr(const char *str1,const char *str2) {const char *s1 = NULL;const char *s2 = NU ...

  5. (C语言)写一个函数,实现两个字符串的比较, 即自己写一个strcmp函数,函数原型为int strcmp(const char* p1, const char* p2)

    写一个函数,实现两个字符串的比较, 即自己写一个strcmp函数,函数原型为int strcmp(const char* p1, const char* p2);设p1指向字符串s1,p2指向字符串s ...

  6. const char * 类型的实参与 char * 类型的形参不兼容_4 种 C++ 强制类型转换,你都清楚吗?...

    我们先来回忆以下,C 语言的强制类型转换形式: (type) expr; 这种旧式强制类型转换从表现形式上来说不够清晰明了,容易看漏,一旦转换过程出现问题,追踪起来也就更加困难. 为了解决以上问题,C ...

  7. char* 赋值 const char* 释放_C/C++编程笔记:C语言中 const 关键字的作用及解析,值得收藏!...

    有时候我们希望定义这样一种变量,它的值不能被改变,在整个作用域中都保持固定.例如,用一个变量来表示班级的最大人数,或者表示缓冲区的大小. 为了满足这一要求,可以使用const关键字对变量加以限定: c ...

  8. 关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法

    关于VS2022 C++报错 const char* 类型的实参与char *类型的形参不兼容解决办法 问题来源 错误原因 解决方案 问题来源 在学习写C++代码时候,去练习课本上课后习题时候的问题, ...

  9. C++ 字符串、string、char *、char[]、const char*的转换和区别

    1.字符串 字符串本质就是一串字符,在C++中大家想到字符串往往第一反应是std::string(后面简称string) 字符串得从C语言说起,string其实是个类,C语言是没有class的,所以C ...

  10. mpeg4ip.h:126: error: new declaration ‘char* strcasestr(const char*, const char*)’

    编译FAAC-1.28时遇到错误: mpeg4ip.h:126: error: new declaration 'char* strcasestr(const char*, const char*)' ...

最新文章

  1. 自定义控件:下拉刷新
  2. XML的序列化和反序列化 详细介绍
  3. Linux命令行与Shell脚本编程大全读书笔记
  4. bootstrap API地址
  5. 2017.5.8-morning
  6. 区块链生态系统将崩溃、Rust 超越 Go、无服务器成主导,这十大计算机预测将成真?...
  7. Javascript中的条件语句和循环语句
  8. 渗透工具TotalPass:TotalPass 是一款默认口令/弱口令扫描工具
  9. PHP环境配置遇到的问题与解决
  10. NVR+DVR+CVR
  11. 如何找到CPU飙升的原因
  12. 访问网站提示:您未被授权查看该页恢复办法
  13. GPIO 使用 — Rockchip
  14. 健身android源码,Android健身饮食记录助手
  15. 怎样查看Redis的版本号
  16. linux命令中插入制表符,linux 中grep 匹配制表符 和 换行符的命令
  17. 中移动员工工资待遇全揭秘
  18. PCL 4PCS点云粗配准
  19. 计算机网络教学优秀教案,线上教学优秀案例:计算机网络基础公开课
  20. 【访问控制-安全标记】自主访问控制和强制访问控制

热门文章

  1. 火热的“互联网+医疗” 究竟是谁的菜?
  2. module.export和exports两者区别及使用方法
  3. CodeMirror踩坑
  4. 局域网 - 打印机共享与连接方法
  5. TSINGSEE青犀视频云边端架构RTSP/RTMP/GB28181智能分析平磁盘录像云端存储出现问题怎么办?
  6. 递归的一些练习题(自学版附带灵魂画师图解)
  7. 【论文阅读】FSADA:Joint network embedding of network structure and node attributes via deep autoencoder
  8. 主流消息中间件及选型
  9. STL:优雅的打印打印vector
  10. python里range什么意思_python中range什么意思