• C++ 之字符串、字符数组与字符指针(*、**)


    C++ 之字符串、字符数组与字符指针(*、**)

    • 最近频繁使用字符串+指针,有时候想取值或者复制,常用到问题,在此总结一下
    • 字符串的处理、指针的使用
    • 长期更新版~

    1. char 使用相关

    1.1 内存使用

    • 首先介绍一下C语言中的数据类型:
      在这里插入图片描述
    • 下图给出了不同数据类型所占的字节数,各种类型的存储大小与系统位数有关,但目前通用的以64位系统为主。以下列出了32位系统与64位系统的存储大小的差别(windows 相同):在这里插入图片描述
    #include 
    #include 
     
    int main()
    {
       printf("float 存储最大字节数 : %lu \n", sizeof(float));
       printf("float 最小值: %E\n", FLT_MIN );
       printf("float 最大值: %E\n", FLT_MAX );
       printf("精度值: %d\n", FLT_DIG );
       
       return 0;
    }
    
    
    **********output***********
    float 存储最大字节数 : 4 
    float 最小值: 1.175494E-38
    float 最大值: 3.402823E+38
    精度值: 6
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20

    1.2 指针

    • 指针也就是内存地址,指针变量是用来存放内存地址的变量。就像其他变量或常量一样,您必须在使用指针存储其他变量地址之前,对其进行声明。指针变量声明的一般形式为:
    //type *var_name;
    char* data;  
    char** data_locatioin
    int* abc;
    
    • 1
    • 2
    • 3
    • 4
    • 举个例子:
    #include 
     
    int main ()
    {
        int var_runoob = 10;
        int *p;              // 定义指针变量
        p = &var_runoob;
     
       printf("var_runoob 变量的地址: %p\n", p);
       return 0;
    }
    
    *********output***********
    var_runoob 变量的地址: 0x7ffeeaae08d8
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    在这里插入图片描述

    1.3 字符串

    • 字符串实际上是使用空字符 \0 结尾的一维字符数组。因此,\0 是用于标记字符串的结束。
    • 声明/定义如下:
    char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
    char site[] = "RUNOOB";
    
    • 1
    • 2

    在这里插入图片描述

    #include 
     
    int main ()
    {
       char site[7] = {'R', 'U', 'N', 'O', 'O', 'B', '\0'};
     
       printf("菜鸟教程: %s\n", site );
     
       char str1[14] = "runoob";
       char str2[14] = "google";
       char str3[14];
       int  len ;
       /* 复制 str1 到 str3 */
       strcpy(str3, str1);
       printf("strcpy( str3, str1) :  %s\n", str3 );
     
       /* 连接 str1 和 str2 */
       strcat( str1, str2);
       printf("strcat( str1, str2):   %s\n", str1 );
     
       /* 连接后,str1 的总长度 */
       len = strlen(str1);
       printf("strlen(str1) :  %d\n", len );
       return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25

    1.4 字符指针

    • 指针就是个变量,用来存放地址,地址唯一标识一块内存空间;指针的大小是固定的4/8个字节(32平台/64平台)。
    char ch = 'w';	//字符变量ch
    char* pc=&ch;	//将字符变量ch的地址取出来,存在pc中。pc就被称为字符指针,类型就是char
    
    --->
    *pc = 'w';
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 将字符串赋值给一个字符指针变量p,不是把字符串的内容赋值给pstr,而是把字符串首字符的地址赋给了pstr
    int main(){
        char* pstr="hello";
        printf("%s\n",pstr);
        return 0;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 打印:
    • 打印一个字符,用%c,p里面存的是a的地址,*p就是a。
    • 打印整个字符,遇到**“\0”**停止,用%s,p里面存的就是a的地址。直接把p放在后面,就从p存的地址处开始打印一个字符串,就能打印出“abcdef”。
    int main() {
    	 char arr[] = "abcdef";	//字符串存入arr数组里面
     	 char* pc=arr;//pc字符指针存放数组名,即首元素地址。
    	 printf("%s\n", arr);   //abcdef
    	 printf("%s\n", pc);    //abcdef
    	 printf("%c\n",*pc);    //a 
         printf("%s\n", pc+2);  //cdef
         
         for(int i=0;i<7;i++)
         {
             printf("%c",*(pc+i));
         }
    	 return 0;
    }
    
    ***********output**********
    abcdef
    abcdef
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    2. 字符指针传参

    • 通常图像数据会被定义为uchar/unsigned char类型的指针存储,下边给出调用方式:
    #include
    
    int add(uchar*srcdata1,uchar*srcdata2,uchar*dstdata,int h,int w,int c)
    {
        if(c==3)
        {
            cv::Mat src1=cv::Mat(h,w,CV_8UC3,srcdata1);
        }
        .....
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 但是今天遇到了一个指针传参的问题,是通过C++的exe中调用C++封装的dll中的接口更新指针数据/图像数据
    //DLL中函数定义:
    int DLL WINAPI imgGrab(unsigned char* imgdata)
    {
        imgdata=getNextFrame();
    }
    
    //exe中:
    main()
    {
        uchar* data=new uchar[h*w*c];
        imgGrab(data);
    }
    ------如上方法调用时,在dll中图像数据正常,但是传递出来的图像数据全为0,异常---
    ---->然后做了如下修改:
    //DLL中函数定义:
    int DLL WINAPI imgGrab(unsigned char** imgdata)
    {
        *imgdata=getNextFrame();
    }
    
    //exe中:
    main()
    {
        uchar* data=new uchar[h*w*c];
        imgGrab(&data);
    }
    ------->解决!
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    DBCO-C12-amine,DBCO-C12-NH2,二苯并环辛炔-碳12-氨基, DBCO-C12-胺
    git commit 时 报错 ‘lint-staged‘ 不是内部或外部命令,也不是可运行的程序 或批处理文件
    项目日历是什么?如何规划?
    [附源码]计算机毕业设计springboot动物保护协会网站
    PBI 访问情况
    SpringMVC---SSM整合&&异常处理&&拦截器
    动作活体检测能力,构建安全可靠的支付级“刷脸”体验
    搭建免登录sftp和java代码调试获取数据
    Hive窗口函数大全
    chatgpt赋能python:Python怎么入侵手机
  • 原文地址:https://blog.csdn.net/yohnyang/article/details/134450614